foo
se imprimirán en primer lugar, como el los objetos se inicializan en el orden de sus declaraciones. Correr y ver:
Por cierto, no es __attribute__((constructor))
estándar de C++. Es la extensión de GCC. Entonces, el comportamiento de su programa depende de cómo lo haya definido GCC. En resumen, está definido por la implementación, de acuerdo con foo
se imprime primero.
El doc dice,
El atributo constructor hace que la función que se llamará automáticamente antes de la ejecución entra en main(). De forma similar, el atributo destructor hace que la función sea llamada automáticamente después de que main() se haya completado o se haya llamado a exit(). Las funciones con estos atributos son útiles para inicializar datos que se usarán implícitamente durante la ejecución del programa.
Puede proporcionar una prioridad entera opcional para controlar el orden en que se ejecutan las funciones de constructor y destructor. Un constructor con un número de prioridad más pequeño se ejecuta antes que un constructor con un número de prioridad más grande; la relación opuesta vale para los destructores. Por lo tanto, si tiene un constructor que asigna un recurso y un destructor que desasigna el mismo recurso, ambas funciones suelen tener la misma prioridad. Las prioridades para las funciones constructor y destructor son las mismas que las especificadas para los objetos C++ de ámbito de nombre de espacio (ver Atributos C++).
creo que el texto en negrita indica, los objetos se inicializan en el orden de sus declaraciones, como he dicho antes, que está prácticamente confirmado por online demo también.
supongo que también le gustaría leer esto:
Si desea controlar/alterar el orden de inicialización, puede utilizar init_priority
atributo, proporcionando prioridad. Tomado de the page:
Some_Class A __attribute__ ((init_priority (2000)));
Some_Class B __attribute__ ((init_priority (543)));
Aquí, B
se inicializa antes A
.
¿Dónde se usa ese tipo de características de compilación? – AlexTheo
@AlexTheo: Eso es bastante común. Ver p.. Usualmente lo usas cada vez que quieres inicializar algo. –
Albert
En realidad, prefiero algo así como static const bool _isInitialized y haciendo una función de inicialización privada con la que inicializo mi objeto como const bool MyClass :: _ isInitialized = initFunction(); Pero estos son solo para objetos que me gusta inicializar antes que nada. De lo contrario, el constructor debería hacer un trabajo. – AlexTheo