variable una programacion orientada objetos miembros funciones funcion estaticos estaticas estatica ejemplos clase c++ c++11

c++ - una - Garantizando inicialización estática(constante) de objetos estáticos.



static en java (2)

La pregunta general es: ¿cómo puede un programador asegurarse de que sus variables estáticas no locales se inicialicen a través de la inicialización estática y no a través de la inicialización dinámica?

Como la inicialización con cero se realiza siempre, se debe observar la inicialización constante.

3.6.2.2 Un inicializador constante para un objeto o es una expresión que es una expresión constante, excepto que también puede invocar constructores constexpr para o y sus subobjetos incluso si esos objetos son de tipos de clase no literales [Nota: tal clase puede tener un destructor no trivial —tendra nota]. La inicialización constante se realiza:

- si cada expresión completa (incluidas las conversiones implícitas) que aparece en el inicializador de una referencia con duración de almacenamiento de hilos o estática es una expresión constante (5.19) y la referencia está vinculada a un valor l que designa un objeto con una duración de almacenamiento estático oa temporal (ver 12.2);

- si un objeto con duración de almacenamiento de subprocesos o estática es inicializado por una llamada de constructor, y si la inicialización de expresión completa es un inicializador constante para el objeto ;

- si un objeto con una duración de almacenamiento de subprocesos o estática no se inicializa con una llamada del constructor y si el objeto está inicializado con valores o cada expresión completa que aparece en su inicializador es una expresión constante .

Omití la referencia ya que no es importante en mi caso. Como entiendo la norma es que hay 3 casos:

  1. ctor
  2. Inicialización de no-ctor y valor
  3. expresión no-ctor y constante

Digamos que tengo una clase siguiente:

struct X { bool flag = false; // = {} will break VS2013 CTP so in that case use the // regular ctor, which sadly still can''t be declared constexpr std::aligned_storage<sizeof(int), alignof(int)>::type storage = {}; };

Por lo que puedo decir, esta clase es perfectamente válida para la inicialización constante (cada elemento se puede inicializar constantemente). ¿Es esto cierto?

¿Esta clase requiere un constructor constexpr ?

¿Se garantiza una inicialización constante para C ++ 11 y C ++ 98?

Pregunta secundaria: ¿Cuándo se realizará la inicialización estática en caso de so / dll? ¿Durante el tiempo de carga, o podría retrasarse aún más?


Pregunta secundaria: ¿Cuándo se realizará la inicialización estática en caso de so / dll? ¿Durante el tiempo de carga, o podría retrasarse aún más?

En Windows, la inicialización estática se produce antes de que se invoque DllMain () con el bloqueo del cargador DLL adquirido. Esto limita severamente lo que puede hacer en los constructores para sus objetos estáticos. No puede cargar ninguna otra DLL (LoadLibrary) ni llamar a ninguna otra función que PODRÍA hacer que se cargue una DLL, lo que prácticamente descarta cualquier cosa más allá de la simple inicialización y las funciones exportadas por Kernel32.

Consulte los últimos párrafos de los documentos de DllMain (MSDN) para obtener más información.


Sería bueno saber el propósito detrás de esta pregunta. Y también si su preocupación es la asignación o específicamente la inicialización.

Sin embargo, el tipo de inicialización no debería importar porque el espacio requerido se asigna en el momento de la compilación. Dependiendo de cómo defina la variable, terminará en la sección .bss o .data.

Como sabe, la inicialización es solo para asegurar un contenido específico en la memoria antes de que se use por primera vez. Si no define un constructor que asigna memoria dinámica, no habrá ninguna asignación dinámica (si esa es su preocupación).

Para los constructores simples, creo que el compilador generará el código en línea y usará el mismo para inicializar el objeto en el momento de la compilación (no estoy seguro de qué se refiere el estándar, pero es posible que sea dependiente de la cadena de herramientas). Con constructores complejos Los objetos estáticos no locales se inicializarán cuando la imagen se cargue en la memoria y los objetos estáticos locales se inicializarán cuando se cargue el marco de pila. En cualquier caso, debe encontrar el objeto en un estado conocido antes del primer uso.