comportement d’instanciation variable statique globale

Ma question est simple, peut-être que la réponse n’est pas.

En C ++ (en utilisant le compilateur Intel C ++ 13.1 sur Win7), les variables statiques globales sont-elles toujours instanciées avant l’exécution de main() ? Si non, cela dépend-il des options de compilation (comme /Ox )?

S’ils sont déclarés et définis dans DLL , est-ce la même chose?

Voici un cas:

J’ai quelque chose comme:

 // in DLL.h class MyClass { public: MyClass(); }; static MyClass *sgMyClassPtr; 

et

 // in DLL.cpp MyClass *sgMyClassPtr = new MyClass; MyClass::MyClass() { // Code to execute here } 

Notez que j’ai omis la déclaration d’exportation mais qu’elle est correctement exscope.

De mon code d’application principal, il semble que MyClass::MyClass() n’a pas toujours été exécuté lorsque je l’exécute. Je ne comprends vraiment pas, mais il semble que si la DLL n’avait pas encore été chargée ou que le fichier statique n’avait pas été instancié correctement. Notez qu’il n’y a pas de threading et que chaque appel est synchrone (du moins dans mon code!)

Si vous avez une idée ou une suggestion, ce sera apprécié. Je vous remercie!


MISE À JOUR 1

Ce sera peut-être plus facile si je vous dis ce que je veux plutôt que ce que j’ai fait …

Je souhaite avoir une variable automatiquement instanciée au moment du chargement de la DLL. Cette variable sera enregistrée (ptr stockée dans un std :: set, par exemple) par un singleton dans l’application (le .exe). L’application singleton ne connaît pas la DLL, mais la DLL connaît le singleton de l’application. Donc, sur le chargement de la DLL, je veux que le var instancie maintenant, puis s’enregistre dans le singleton de l’application. C’est pourquoi j’ai déclaré la variable statique dans la DLL et l’ai instanciée à cet endroit. L’enregistrement est effectué dans le cTor.

Ma question initiale était la suivante: l’instanciation statique se produit-elle directement sur le chargement de la DLL ou peut-elle être retardée? Je pose cette question parce que parfois j’observe des comportements étranges et cela ressemble à un problème asynchrone … ???

L’initialisation statique se produit lorsque la DLL est chargée, mais en fonction des options de l’éditeur de liens, la DLL peut être chargée à la demande. Notez que si vous incluez la classe à la fois dans la DLL et le programme principal mais que vous ne l’exportez pas à partir de la DLL, vous obtiendrez deux copies du code et éventuellement deux copies de vos variables statiques (de classe). Ainsi, vous risquez d’être confus en ce qu’une copie n’est pas initialisée lorsque l’autre est déjà en place.

Mais assurez-vous de bien comprendre les options de l’éditeur de liens lors du chargement initial des DLL.