Es un literal de cadena en c++ creado en memoria estática y destruye sólo cuando se sale del programa?

InformationsquelleAutor yesraaj | 2008-12-08

4 Comentarios

  1. 42

    Donde se crea una aplicación de la decisión por el compilador escritor, realmente. Más probable es que, los literales de cadena se almacena en leer-sólo los segmentos de memoria, ya que nunca cambian.

    En el compilador antiguo de los días, que se utiliza para tener datos estáticos como estos literales, y en global y cambiante de datos. Estos fueron almacenados en el TEXTO (código) segmento de DATOS (consultar datos) segmento.

    Incluso cuando usted tiene un código como char *x = "hello";, el hello propia cadena se almacena en la memoria de sólo lectura, mientras que la variable x está en la pila (o en otro lugar en la escritura de la memoria si es un mundial). x sólo se establece en la dirección de la hello cadena. Esto permite que todo tipo de cosas complicadas como la cadena de plegamiento, de modo que la «opción no válida» (0x1000) y «opción válida» (0x1002) puede 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 | 
    +-> 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 |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
    | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

    Mantener en mente no me refiero a la memoria de sólo lectura en términos de la ROM, solo la memoria que se dedica a almacenar inmutable cosas (que puede ser marcado realmente sólo lectura por el sistema operativo).

    Son también nunca se destruye hasta que main() salidas.

    • El segmento BSS sólo que jamás se haya celebrado en cero pero no constante de datos; los datos se inicializa en cero los valores de se en el segmento de DATOS.
    • Estoy asumiendo que era como un comentario sobre la respuesta de JamesHopkin. Que la respuesta que sostiene que «los literales de cadena son válidos para toda la duración del programa, incluso durante la destrucción de objetos estáticos». Ni mi respuesta ni de descansar (el otro que poner este comentario en) sostiene esto, pero al menos tienes James rodeado 🙂
  2. 44

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

    2.13.4/1 en el Estándar dice

    Ordinaria literal de cadena tipo «matriz de n const char» y estática de almacenamiento de duración.

    La Norma dice de ‘almacenamiento estático duración» en 3.7.1/1:

    El almacenamiento de estos objetos, se concederán por el tiempo de duración del programa.

  3. 3

    Bueno … Sí. Que clase de ser; la información de la que se compone la secuencia de caracteres en cada cadena tiene que estar en alguna parte. Si fueran a ser asignados dinámicamente y luego se inicializa, donde la información utilizada para la inicialización de residir? Por lo tanto, es más eficiente simplemente que las cadenas de texto estático, por lo que siempre están disponibles y válido una vez que el programa se termine de cargar.

  4. -1

    Literales de cadena se almacenan en leer-sólo los segmentos de memoria

    • Es probable, pero no es necesario. Una implantación conforme no puede de la tienda literales de cadena en memoria de lectura-escritura. Cualquier programa que puede decir la diferencia tiene un comportamiento indefinido de todos modos. Por supuesto, los almacena en la memoria de sólo lectura es una buena idea (si el sistema subyacente es compatible).

Dejar respuesta

Please enter your comment!
Please enter your name here