Oui, il n'a normalement se traduire par une implicite if
déclaration avec une interne indicateur booléen. Ainsi, dans la plupart des applications de base de votre déclaration se traduit normalement par quelque chose comme
void go( int x ) {
static int j;
static bool j_initialized;
if (!j_initialized) {
j = x;
j_initialized = true;
}
...
}
En plus de cela, si votre objet statique est un non-trivial destructeur, la langue doit obéir à une autre règle: ces objets statiques doivent être détruits dans l'ordre inverse de leur construction. Depuis la construction de l'ordre n'est connue qu'au moment de l'exécution, la destruction de l'ordre est défini au moment de l'exécution ainsi. Donc, chaque fois que vous construisez un local objet statique non triviale destructeur, le programme doit s'inscrire dans une sorte de linéaire conteneur, qui sera, plus tard, les utiliser pour détruire ces objets dans le bon ordre.
Inutile de dire, les détails réels dépendent de la mise en œuvre.
Il convient d'ajouter que lorsqu'il s'agit d'objets statiques de "primitifs" types (comme int
dans votre exemple) initialisé avec des constantes de compilation, le compilateur est libre pour initialiser cet objet au démarrage. Jamais vous ne verrez la différence. Toutefois, si vous prenez un exemple plus complexe avec un "non-primitif" de l'objet
void go( int x ) {
static std::string s = "Hello World!";
...
ensuite, l'approche ci-dessus avec if
est ce que vous devriez vous attendre à trouver dans le code généré, même lorsque l'objet est initialisé avec une constante de compilation.
Dans votre cas, l'initialisation n'est pas connu au moment de la compilation, ce qui signifie que le compilateur a pour retarder l'initialisation et l'utilisation que l'implicite if
.