60 votes

Quand les membres de classe C ++ statiques sont-ils initialisés?

Il semble n'y avoir aucune réponse facile à cette question, mais existe-t-il des hypothèses qui peuvent être établies en toute sécurité quant à l'accès à un champ de classe statique?

EDIT: La seule hypothèse sûre semble être que toutes les statiques sont initialisées avant le début du programme (appel à main ). Donc, tant que je ne fais pas référence à la statique depuis un autre code d'initialisation statique, je ne devrais avoir aucune inquiétude?

55voto

Tadeusz Kopec Points 7625

La norme garantit deux choses - que les objets définis dans la même unité de traduction (en général cela signifie .fichier cpp) sont initialisés dans l'ordre de leur définition (pas de déclarations):

3.6.2

Le stockage pour les objets statiques durée de stockage (de base.stc.statique) doit être initialisé à zéro (dcl.init) avant toute autre initialisation a lieu. Zéro-initialisation et l'initialisation avec une expression constante sont collectivement appelés initialisation statique; tous les autres initialisation dynamique de l'initialisation. Les objets de la GOUSSE de types de base.les types) avec la durée de stockage statique initialisé avec des expressions constantes (expr.const) doit être initialisé avant tout dynamique de l'initialisation a lieu. Les objets statiques de stockage durée définie dans l'espace de noms de champ dans la même unité de traduction et dynamique initialisé doit être initialisé dans l'ordre de leur définition s'affiche dans l'unité de traduction.

Les autres garanties, c'est que l'initialisation des objets statiques à partir d'une unité de traduction sera effectuée avant l'utilisation de tout objet ou de la fonction à partir de cette unité de traduction:

Il est définis par l'implémentation de savoir si ou de ne pas la dynamique de l'initialisation (dcl.l'initialisation de la classe.classe statique.ctor, classe.expl.init) d'un objet de l'espace de noms portée est fait avant la première instruction de la main. Si l'initialisation est reportée à un certain point dans le temps après la première instruction de la main, il doit se produire avant la première utilisation d'une fonction ou d'un objet défini dans la traduction même de l'unité de l'objet à être initialisé.

Rien d'autre je garanti (surtout de l'ordre de l'initialisation des objets définis dans les différentes unités de traduction est définie par l'implémentation).

19voto

ChrisW Points 37322

Ils sont initialisés avant le début du programme (c'est à dire avant main est entré).

Lorsqu'il y a deux ou plusieurs définitions de données statiques) dans un seul fichier CPP, alors qu'ils sont initialisés dans l'ordre dans lequel elles sont définies dans le fichier (celui défini plus haut/plus élevés dans le fichier est initialisé avant la prochaine est).

Lorsqu'il y a deux ou plusieurs définitions de données statiques) dans plus d'un fichier CPP, l'ordre dans lequel les fichiers CPP sont traitées est pas défini/mise en œuvre spécifiques. C'est un problème si le constructeur d'une variable globale (appelée avant que le programme est démarré) fait référence à une autre variable globale définie dans un autre fichier CPP, qui n'aurait pas été encore construit. Toutefois, l'article 47 de Meyers Effective C++ (qui est intitulé s'Assurer que les objets globaux sont initialisés avant qu'ils ne soient utilisés) ne décrit un travail autour de ...

  • Définir une variable statique dans un fichier d'en-tête (il est statique, donc vous pouvez avoir plusieurs instances, sans que l'éditeur de liens se plaindre)

  • Ont le constructeur de cette variable invoquer tout ce dont vous avez besoin (en particulier, de construire le mondial des singletons déclaré dans les en-têtes)

... qui, selon elle, est une technique qui peut être utilisé dans certains système de fichiers d'en-tête par exemple, pour s'assurer que l' cin global variable est initialisée avant même de vos variables statiques constructeurs l'utilisent.

1voto

vehomzzz Points 7182

Ils peuvent être initialisées dans un fichier d'implémentation (.c/cpp/cc) des fichiers. Ne pas initialiser dans .h comme compilateur va se plaindre de multiples définitions.

Ils sont généralement initialisé avant de main, cependant, l'ordre est anonyme, donc d'éviter les dépendances. Certes, elles peuvent être consultées à l'intérieur de la fonction membre. Gardez à l'esprit, de l'ordre de l'initialisation est inconnu pour les membres statiques. Je suggère à encapsuler un membre statique dans la fonction statique qui va vérifier si le membre a été initialisé.

1voto

erelender Points 3634

Je crois qu'il est possible d'y accéder à tout moment pendant l'exécution. Ce qui reste indéfini, c’est l’ordre d’initialisation des variables statiques.

0voto

Dentoid Points 312

Il n’ya pas de réponse totalement triviale à cette question, mais en gros, ils sont initialisés juste avant que le contrôle ne soit passé au point d’entrée (principal) de votre programme. L'ordre dans lequel ils sont initialisés est (à ma connaissance) indéfini et peut être spécifique au compilateur.

EDIT: Pour clarifier, votre hypothèse ajoutée est correcte. Tant que vous y accédez uniquement après l'entrée principale, vous n'avez pas vraiment à vous soucier du moment ou de la manière dont elle est initialisée. Il sera initialisé à cette heure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X