2017-06-26 1 views
3

Si j'ai un lien interne avec une liaison interne qui n'est jamais utilisée, son initialiseur est-il garanti? Par exemple:Initialisateurs statiques de globaux non utilisés

static int x = SideEffectfulFunction(); 

ou

namespace { 
    int x = SideEffectfulFunction(); 
} 

SideEffectfulFunction() est garanti d'être appelé, même si x est jamais référencé? Ou est-il légal de supprimer x?

Répondre

9

Oui, les garanties standard ce

durée de stockage statique [basic.stc.static]

2 Si une variable avec une durée de stockage statique a l'initialisation ou un destructor avec des effets secondaires, il ne doit pas être éliminé même s'il semble être inutilisé, sauf qu'un objet de classe ou sa copie/son déplacement peut être éliminé comme spécifié en 15.8.

+1

me battra 1 nano seconde :) +1. – StoryTeller

+0

@StoryTeller été la lecture de la norme pour des questions comme celle-ci depuis vous parler :) – Curious

+1

me2 :) +1 .......... – mattideluxe

0

L'exécution est garantie. Si vous créez plusieurs objets statiques qui se référencent mutuellement dans des fichiers source différents, il n'y a aucune garantie dans quel ordre les objets seront initialisés, c'est le static initialization order fiasco auquel cas vous pouvez créer une fonction qui crée l'objet statique, s'assurer que l'ordre d'initialisation est d'abord fonction objet, puis l'objet secondaire.

Source: https://isocpp.org/wiki/faq/ctors#static-init-order