2017-06-26 3 views
3

Wenn ich eine globale mit interner Verknüpfung habe, die nie verwendet wird, ist ihr Initialisierer garantiert zu laufen? Zum Beispiel:Statische Initialisierer von nicht verwendeten globalen

static int x = SideEffectfulFunction(); 

oder

namespace { 
    int x = SideEffectfulFunction(); 
} 

Ist SideEffectfulFunction() genannt werden garantiert, auch wenn x nie referenziert wird? Oder ist es zulässig, x zu entfernen?

Antwort

9

Ja, der Standard garantiert, dass diese

Statische Lagerdauer [basic.stc.static]

2 Wenn eine Variable mit statischer Speicherdauer der Initialisierung hat oder einen Destruktor mit Nebenwirkungen, es darf nicht eliminiert werden, auch wenn es unbenutzt erscheint, außer dass ein Klassenobjekt oder seine Kopie/Bewegung eliminiert werden kann, wie in 15.8 spezifiziert.

+1

mich zweiten von 1 Nano schlagen :) +1. – StoryTeller

+0

@StoryTeller den Standard für Fragen wie diese seit dem Gespräch mit Ihnen gelesen :) – Curious

+1

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

0

Es ist garantiert zu laufen. Wenn Sie mehr als ein statisches Objekt erstellen, die sich in verschiedenen Quelldateien gegenseitig referenzieren, gibt es keine Garantie, in welcher Reihenfolge die Objekte initialisiert würden. Dies wird als static initialization order fiasco bezeichnet. In diesem Fall können Sie eine Funktion erstellen, die das statische Objekt erstellt. Stellen Sie sicher, dass die Reihenfolge der Initialisierung zuerst das Funktionsobjekt und dann das sekundäre Objekt ist.

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

Verwandte Themen