variable una tipos significado que programacion inicializar ejemplos declaracion declara constantes como c++ memory memory-management

una - ¿La memoria global se inicializa en C++?



tipos de variables en c++ pdf (4)

¿La memoria global se inicializa en C ++? Y si es así, ¿cómo?

(Segunda) aclaración:

Cuando se inicia un programa, ¿qué hay en el espacio de memoria que se convertirá en memoria global, antes de que se inicialicen las primitivas? Estoy tratando de entender si se ha reducido a cero, o basura, por ejemplo.

La situación es: ¿se puede establecer una referencia única - a través de una llamada a instance() , antes de su inicialización?

MySingleton* MySingleton::_instance = NULL;

y obtener dos instancias singleton como resultado?

Ver mi prueba de C ++ en varias instancias de un singleton ...


Del estándar:

Los objetos con una duración de almacenamiento estática (3.7.1) se inicializarán en cero (8.5) antes de que se lleve a cabo cualquier otra inicialización. La inicialización cero y la inicialización con una expresión constante se denominan colectivamente inicialización estática ; el resto de la inicialización es inicialización dinámica . Los objetos de tipos POD [datos antiguos simples] (3.9) con duración de almacenamiento estático inicializados con expresiones constantes (5.19) se inicializarán antes de que tenga lugar cualquier inicialización dinámica. Los objetos con duración de almacenamiento estático definidos en el ámbito de espacio de nombres en la misma unidad de traducción e inicializados dinámicamente se inicializarán en el orden en que aparece su definición en la unidad de traducción. [Nota: 8.5.1 describe el orden en que se inicializan los miembros agregados. La inicialización de objetos estáticos locales se describe en 6.7.]

Entonces, sí, se inicializarán los globales que tengan una duración de almacenamiento estático. Los Globals asignados, por ejemplo, en el montón, por supuesto, no se inicializarán automáticamente.


Sí, las primitivas globales se inicializan a NULL.

Ejemplo:

int x; int main(int argc, char**argv) { assert(x == 0); int y; //assert(y == 0); <-- wrong can''t assume this. }

No puede hacer suposiciones sobre clases, estructuras, matrices, bloques de memoria en el montón ...

Es más seguro solo inicializar todo.


Viniendo del mundo integrado ...

Su código se compila en tres tipos de memoria:
1.data: memoria inicializada
2. .text: constantes y código
3.bsbs: memoria no inicializada (inicializada a 0 en C ++ si no se inicializa explícitamente)

Globales ingresan .data si se inicializa. Si no, se colocan en .bss y cero en el código premain.


Las variables declaradas con ámbito estático / global siempre se inicializan al menos con VC ++.

En algunas circunstancias, en realidad puede haber una diferencia en el comportamiento entre:

int x = 0; int main() { ... }

y

int x; int main() { ... }

Si está utilizando segmentos de datos compartidos, entonces VC ++ al menos usa la presencia de una inicialización explícita junto con un #pragma data_seg para determinar si una variable particular debe ir en el segmento de datos compartidos o el segmento de datos privados para un proceso.

Para mayor diversión, considere lo que sucede si tiene un objeto estático de C ++ con un constructor / destructor declarado en un segmento de datos compartido. El constructor / destructor se invoca cada vez que exe / dll se conecta al segmento de datos, que seguramente no es lo que usted desea.

Más detalles en este artículo de KB