Cuando tengo un StringBuilder
vacío con una capacidad de 5 y escribo "¡Hola, mundo!" Para ello, ¿el estándar C# especifica la nueva capacidad del StringBuilder
? Tengo una vaga memoria de que es el doble de la longitud de la nueva cuerda (para evitar cambiar la capacidad con cada nueva cuerda anexada).¿Cómo cambia la capacidad de StringBuilder?
Respuesta
Depende de qué versión de .NET estás hablando. Antes de .NET 4, StringBuilder utilizaba el standard .NET strategy, duplicando la capacidad del búfer interno cada vez que necesita ampliarse.
StringBuilder fue completamente reescrito para .NET 4, ahora usando ropes. La extensión de la asignación ahora se realiza al agregar otra pieza de cuerda de hasta 8000 caracteres. No es tan eficiente como la estrategia anterior, pero evita problemas con grandes almacenamientos intermedios que obstruyen el gran montón de objetos. El código fuente está disponible en la Fuente de referencia si desea ver más de cerca.
Nos molestó cuando actualizamos nuestro producto de .Net 3.5 a .Net 4.5. Estábamos utilizando un objeto generador de cadenas como parámetro para una llamada API nativa a través de interoperabilidad. Resultó en un problema de desbordamiento del búfer que causó el bloqueo del proceso. La memoria del montón se corrompía cuando la API nativa devolvía cadenas largas. Comenzamos a proporcionar capacidad explícita en el constructor para que el búfer pueda ocuparse de cadenas largas. Sorprendentemente, también debería haber estado rompiendo antes para cadenas largas, pero nunca se informó. ¿Hay algún truco en .Net 3.5 cuando usamos el generador de cadenas como buffer para API nativas? – RBT
Eso corrompe el montón de GC en la versión de tiempo de ejecución. Tal corrupción no se detecta necesariamente, tienes que tener suerte. Claro, usted tiende a tener más suerte en .NET 4 –
El estándar C# no especificará el comportamiento de una clase de biblioteca BCL ya que no tiene nada que ver con la especificación del lenguaje.
Por lo que yo sé el comportamiento real no se define en ninguna especificación y es específico de la implementación.
yo sepa, la aplicación MS se duplicará la capacidad una vez que se ha alcanzado la capacidad actual.
Ver this y this preguntas anteriores de SO.
Actualización:
Esto ha cambiado en .NET 4.0. como se describe por Hans en his answer. Ahora se usa ropes, agregando 8000 caracteres adicionales a la vez.
MSDN, sin embargo es muy cuidadoso en señalar que el comportamiento real es aplicación específica:
El StringBuilder asigna dinámicamente más espacio cuando sea necesario y aumenta la capacidad en consecuencia. Por razones de rendimiento, un StringBuilder podría asignar más memoria de la necesaria. La cantidad de memoria asignada es específica de la implementación.
Ya no usamos la estrategia de doble cuando está completa. –
@Eric - Gracias por corregirme. Eso y la respuesta de Hans me dieron más detalles. – Oded
Nueva StringBuilder (.NET 4.5 o superior) asigna un buffer interno m_ChunkChars
solicitada por el parámetro de capacidad:
public StringBuilder(int capacity) { ... m_ChunkChars = new char[capacity]; ... }
Por lo tanto, si la capacidad es menor que 40K caracteres que va en el Objeto Pequeño montón. Sin embargo (al contrario de la creencia popular), StringBuilder todavía asignará en el montón de objetos grandes si, más adelante, que llamamos sb.Append(...some string larger than 40K chars...);
Una posible solución puede ser encontrado aquí: https://github.com/amikunov/Large-Object-Heap-Fix-For-.NET-String-Builder
Esto no tiene nada que ver con lo que la pregunta está haciendo. – Servy
- 1. capacidad StringBuilder()
- 2. Capacidad predeterminada de StringBuilder
- 3. ¿std :: vector.pop_back() cambia la capacidad del vector?
- 4. Cómo clonar() StringBuilder
- 5. Cómo recortar la cadena de StringBuilder?
- 6. Cómo reutilizar StringBuilder obj?
- 7. StringBuilder: cómo obtener la cadena final?
- 8. Una vez que se utiliza HiLo, ¿qué sucede si cambia la capacidad (Lo máximo)?
- 9. ¿Cómo heredas StringBuilder en vb.net?
- 10. Scala StringBuilder
- 11. StringBuilder o + =
- 12. ¿Cómo afecta la capacidad de tipeo estático de Python la capacidad de mantenimiento y la extensibilidad en proyectos más grandes?
- 13. Capacidad de ArrayList
- 14. Cómo deshacerse de un objeto StringBuilder
- 15. ¿Estoy minando la eficiencia de StringBuilder?
- 16. jquery texto cambia cuando la entrada cambia
- 17. StringBuilder/StringBuffer vs. "+" Operador
- 18. Capacidad de PHP para manejar la recursión
- 19. reducir la capacidad de un vector stl
- 20. Adjuntar con StringBuilder
- 21. Cómo liberar la capacidad no utilizada de una cadena
- 22. ¿Cómo obtener la capacidad de ArrayList en Java?
- 23. Cómo deshabilitar la capacidad de seleccionar en un DataGridView?
- 24. ¿Cómo establecer la capacidad CAP_SYS_NICE para un usuario de Linux?
- 25. Capacidad de uint64_t?
- 26. java outOfMemoryError con stringbuilder
- 27. ¿Cómo se cambia la contraseña de ActiveAdmin?
- 28. StringBuilder literal Groovy/StringBuffer
- 29. StringBuilder Vs StringWriter/StringReader
- 30. StringBuilder append vs +
esto no se especifica en cualquier punto de vista, es sólo un detalle de implementación – BrokenGlass
StringBuilder no es parte del lenguaje C#. Es parte de las bibliotecas .net. –
posible duplicado de [¿Cómo decide StringBuilder qué tan grande debe ser su capacidad?] (Http://stackoverflow.com/questions/4495855/how-does-the-stringbuilder-decide-how-large-its-capacity-should -be) – bzlm