2008-12-08 15 views

Respuesta

35

Donde se crea es una decisión de implementación por parte del escritor del compilador, realmente. Lo más probable es que los literales de cadena se almacenen en segmentos de solo lectura de memoria ya que nunca cambian.

En los viejos días de compilación, solía tener datos estáticos como estos literales y datos globales pero modificables. Estos se almacenaron en el segmento TEXTO (código) y en el segmento DATOS (datos inicializados).

Incluso cuando se tiene un código como char *x = "hello";, la cadena hello misma se almacena en memoria de sólo lectura, mientras que la variable x está en la pila (o en la memoria se puede escribir en otro lugar si es un mundial). x simplemente se establece en la dirección de la cadena hello. Esto permite que todo tipo de cosas difíciles como el plegado cadena, por lo que "opción no válida" (0x1000) y "opción válida" (0x1002) pueden utilizar el mismo bloque de memoria de la siguiente manera:

+-> plus:0 1 2 3 4 5 6 7 8 9 A B C D E 
|  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+ 
0x1000 | i | n | v | a | l | i | d | | o | p | t | i | o | n | \0 | 
     +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+ 

Tenga en cuenta I don' t significa memoria de solo lectura en términos de ROM, solo memoria que está dedicada a almacenar cosas inmutables (que pueden estar marcadas como realmente solo de lectura por el sistema operativo).

Tampoco se destruyen hasta que main() sale.

+0

El segmento BSS solo contenía datos a cero pero no constantes; los datos inicializados a valores distintos de cero estaban en el segmento DATOS. –

+0

@Destructor, supongo que fue un comentario sobre la respuesta de JamesHopkin. * Esa es * la respuesta que sostiene que "los literales de cadena son válidos durante toda la duración del programa, incluso durante la destrucción de objetos estáticos". Ni mi respuesta ni la de desenrollar (la otra en la que pones este comentario) sostienen esto, pero al menos has rodeado a James :-) – paxdiablo

39

Sí, los literales de cadena son válidos durante toda la duración del programa, incluso durante la destrucción de objetos estáticos.

2.13.4/1 en la Norma dice

Una cadena literal ordinaria es de tipo "arreglo de char const n" y la duración de almacenamiento estático.

La norma dice de 'duración de almacenamiento estático' en 3.7.1/1:

El almacenamiento de estos objetos tendrá una duración de la duración del programa.

3

Bueno ... Sí. De alguna manera tienen que serlo; la información que compone la secuencia de caracteres en cada cadena tiene que estar en alguna parte. Si se asignaran dinámicamente y luego se inicializaran, ¿dónde residiría la información utilizada para la inicialización? Por lo tanto, es más eficiente simplemente hacer las cadenas estáticas, de modo que estén siempre disponibles y sean válidas una vez que el programa termine de cargarse.

-1

Los literales de cadena se almacenan en segmentos de solo lectura de la memoria

+4

Probablemente, pero no es obligatorio. Una implementación conforme * podría * almacenar literales de cadena en la memoria de lectura/escritura. Cualquier programa que pueda ver la diferencia tiene un comportamiento indefinido de todos modos. Por supuesto, almacenarlos en la memoria de solo lectura es una buena idea (si el sistema subyacente lo admite). –

Cuestiones relacionadas