Initialisation dynamic

C ++ 03 Standard [basic.start.init] le point 3 indique:

Il est défini par l’implémentation que l’initialisation dynamic (8.5, 9.4, 12.1, 12.6.1) d’un object de la scope de l’espace de noms soit effectuée ou non avant la première instruction de main. Si l’initialisation est différée à un moment donné après la première déclaration de main, elle doit avoir lieu avant la première utilisation d’une fonction ou d’un object défini dans la même unité de traduction que l’object à initialiser.

Les compilateurs Microsoft, en fonction de considérations de démarrage supplémentaires , effectuent l’initialisation avant de main() .

Je n’ai pas pu obtenir de documentation indiquant le comportement des compilateurs GNU et Sun Forte.

Est-ce que quelqu’un peut:

  1. Pointez-moi vers la documentation décrivant le comportement des compilateurs GNU et Forte en ce qui concerne l’initialisation dynamic (j’ai vérifié le manuel de GCC et rien trouvé concernant l’initialisation dynamic).
  2. Commentez la sécurité des threads de l’initialisation dynamic différée (si deux threads tentent d’appeler une fonction de la même unité de traduction contenant un object non local).

FWIW, j’ai observé le comportement de g ++ de GNU et de CC de SUN et tous les deux ont effectué l’initalisation avant le principal, bien que je n’accepte pas cela comme une réponse définitive. ( Je peux poster le code très simple que j’avais l’habitude d’observer si quelqu’un était intéressé mais que la question était suffisamment longue. )

La réponse définitive est que tous les compilateurs effectuent une initialisation statique avant main , à moins que les objects ne se trouvent dans une DLL chargée ultérieurement. En pratique, il est (presque) impossible de satisfaire aux exigences du texte que vous citez autrement. (Pensez à ce qui se passe s’il y a un cycle.)