uso resueltos optimizan memoria las estructuras ejercicios dinámicas dinamicos dinamica datos cómo asignacion arreglos c++ c string memory static

c++ - resueltos - Las cadenas en el conteo de instancias de memoria estática



malloc y calloc (4)

Como sé, las cadenas tipo C de compilación se guardan en la memoria estática como una sola instancia. Por ejemplo, obtuve ambos true en el ejemplo de ejecución de gcc 4.6 a continuación. Pero me pregunto si siempre es cierto y puede ser portátil. El comportamiento en C y C ++ es interesante.

#include <iostream> bool amIportable(const char* value) { const char* slocal = "Hello"; return (slocal==value); } int main() { const char* s = "Hello"; std::cout << std::boolalpha << amIportable(s) << ''/n'' << amIportable("Hello") << ''/n''; }


Pero me pregunto si siempre es cierto

No, al menos el estándar C dice algo así como "si dos literales de cadena idénticos están almacenados en la misma matriz está definido por la implementación".


Está comparando dos literales de cadena diferentes, que tienen el mismo valor. De acuerdo con el estándar de C ++, se define la implementación de si los literales de cadena idénticos ocupan la misma memoria o no (lo que significa que la implementación debe documentar lo que hace); de acuerdo con el estándar C, no está especificado. (Supongo que el estándar de C ++ permitiría a la implementación documentar algo como "los literales de cadena de contenido idéntico comparten la misma instancia si están en la misma unidad de traducción y no comparten la misma instancia de lo contrario").

Si su objetivo es poder comparar punteros, la solución habitual es usar una función (estática si es un miembro de la clase) que devuelve el literal de la cadena:

char const* value() { return "Hello"; } bool isHello( char const* str ) { return str == valule; }

y luego asegúrese de que todas las instancias de la cadena se obtengan llamando al value() .


No, depende de la implementación tanto para C como para C ++.

C11 §6.4.5 / 7 literales de cadena

No se especifica si estas matrices son distintas siempre que sus elementos tengan los valores adecuados. Si el programa intenta modificar dicha matriz, el comportamiento no está definido.

C ++ 11 §2.14.5 / 12 Literales de cadena

Si todos los literales de cadena son distintos (es decir, se almacenan en objetos no superpuestos) está definido por la implementación. El efecto de intentar modificar un literal de cadena no está definido.


No, esto no siempre es cierto, ni es portátil.

La fusión de literales de cadenas idénticas es una optimización que realizan el compilador y el vinculador trabajando en conjunto. Las versiones recientes tanto de GCC como del compilador de Microsoft lo admiten, pero solo cuando se establecen ciertos conmutadores de optimización.

Y no es solo una función de "encendido" o "apagado". Los diferentes compiladores y las diferentes configuraciones de optimización también afectarán la agresividad con que se realice. Por ejemplo, a veces los literales de cadena se agrupan solo dentro del alcance de una función individual, otras veces sucede en el nivel de la unidad de traducción, y otras veces el vinculador puede involucrarse para hacerlo a través de múltiples unidades de traducción.

Esto está permitido porque las normas C y C ++ dejan este comportamiento como dependiente de la implementación.