2011-04-08 17 views

Respuesta

8

Gracias Por defecto, la memoria asignada para std::string se asigna dinámicamente.

Tenga en cuenta que std::string tiene una función que devuelve el número máximo de caracteres admitidos por la implementación. La utilidad de esto es cuestionable, ya que es un máximo de implementación, y no toma en consideración otros recursos, como la memoria. Tu límite real es mucho más bajo. (Intenta asignar 4 GB de memoria contigua, ni tomó en el agotamiento de memoria cuenta en otros lugares.)

+0

ah, pensé que sería una pila limitada porque se parece a cualquier otra var. Supongo que cualquier objeto std :: se asigna en montón? – eugene

+0

@Eugene: no, 'myVar' está asignado a la pila, sin embargo, contiene un búfer interno para almacenar la cadena asignada en el montón (en general). Los contenedores std usualmente toman un parámetro 'Allocator' que se encarga de asignar recursos, y generalmente asigna en el montón, aunque podría (en teoría) asignar en la pila. –

+0

@Eugene depende, pero para los contenedores, sí, los datos están en montón normalmente. siempre puedes hackear un asignador para "usar" la pila (bleh). – Anycorn

2

Un objeto std::string se asignará la misma forma en que un int o cualquier otro tipo debe ser: en la pila si se trata de una variable local, o podría ser static, o en el montón si se utiliza o new std::stringnew X donde X contiene el string etc ..

embargo, que std::string objeto puede contienen al menos un puntero a la memoria adicional proporcionada por el asignador con la que basic_string < > se creó una instancia - para el std::stringtypedef eso significa memoria asignada en el montón. Ya sea directamente en la memoria original std::string objeto o en punta-a amontonar se puede esperar encontrar:

  • un miembro tamaño de la cadena,
  • posiblemente algún tipo de contador de referencias o enlaces,
  • los datos textuales las almacenes de cadena (si lo hay)

algunas implementaciones std::string tienen optimizaciones "cadena corta" donde se embalan cadenas de sólo unos pocos caracteres directamente en el propio objeto de cadena (por eficiencia de la memoria, a menudo utilizando algún tipo de unión con campos que se usan para otros fines cuando las cadenas son más largas). Pero, para otras implementaciones de cadenas, e incluso para aquellas con optimizaciones de cadenas cortas cuando se trata de cadenas que son demasiado largas para caber directamente en el objeto std :: string, tendrán que seguir punteros/referencias a los datos textuales que se almacenan en la memoria proporcionada por el asignador (montón).

Cuestiones relacionadas