¿Es una cadena literal en C++ creada en memoria estática y destruida solo cuando el programa sale?¿Es una cadena literal en C++ creada en memoria estática?
Respuesta
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.
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.
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.
Los literales de cadena se almacenan en segmentos de solo lectura de la memoria
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). –
- 1. literal de cadena en c
- 2. ¿Metacaracidad desconocida en C/C++ cadena literal?
- 3. dirección de memoria literal
- 4. C++: Constructor aceptando solo una cadena literal
- 5. Asigne memoria estática en la memoria caché de la CPU en c/C++: ¿es posible?
- 6. Direccionamiento de la dirección de una cadena literal en C
- 7. vida útil de una cadena literal devuelto por una función
- 8. ¿Puedo escapar una comilla doble en una literal litera literal?
- 9. asignar una matriz de caracteres a una cadena literal - C++
- 10. ¿Cómo usar una cadena literal JSON?
- 11. Llamar a NSLog desde C++: "Cadena de formato no es una cadena literal (potencialmente insegura)"
- 12. Cómo inyectar caracteres no ASCII en un literal de cadena en C/C++
- 13. C++ cadena tipo de datos literal almacenamiento
- 14. una variable estática en c
- 15. función R que devuelve una cadena literal
- 16. Cómo devolver una matriz literal en C#
- 17. ¿Qué es una función literal en Scala?
- 18. de cifrado/ofuscar una cadena literal en tiempo de compilación
- 19. Asignar memoria y guardar cadena en C
- 20. extern en una función estática en C++
- 21. Cómo devolver un literal de cadena desde una función
- 22. Javascript - Reemplazar el carácter de escape en una cadena literal
- 23. Variable de cadena estática en el Objetivo C en iphone
- 24. Tipo de literal nulo en C#
- 25. Diferencia entre estática en C y estática en C++ ??
- 26. Access como literal de cadena en PHP
- 27. Emparejar correctamente una cadena de Java literal
- 28. Python prima cadena literal
- 29. C++: pasar una cadena literal de Tipo const char * a una cadena de parámetro
- 30. cadena incompleta literal
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. –
@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