2016-03-30 24 views
5

Trovo che in pratica, con una varietà di compilatori C++ 11/C++ 14, un std::atomic ha un valore iniziale indefinito proprio come sarebbe se fosse un tipo "raw". Cioè, ci aspettiamo che per l'espressioneQual è il valore predefinito per std :: atomic?

int a; 

a può avere alcun valore. Risulta anche essere vero che per l'espressione

std::atomic<int> b; 

b può anche avere qualsiasi valore. Per dirla in un altro modo,

std::atomic<int> b;   // b is undefined 

non è equivalente a

std::atomic<int> b{ 0 }; // b == 0 

o

std::atomic<int> b{};  // b == 0 

perché in questi ultimi due casi b viene inizializzato ad un valore noto.

La mia domanda è semplice: dove nella specifica C++ 11 o C++ 14 questo comportamento è documentato?

risposta

6

[atomics.types.generic]/5 dice questo circa specializzazioni integrali:

Le specializzazioni integrali atomici e la specializzazione atomica avrà layout standard. Ognuno di essi ha un costruttore di default banale e un distruttore banale. Ognuno di essi supporterà la sintassi di inizializzazione dell'aggregato .

Inoltre, il modello di sintesi primario all'inizio della stessa sezione specifica normatively il costruttore di default come:

atomic() noexcept = default; 

Gli effetti sono definiti in [atomic.types.operations]/4 come:

Effetti: lascia l'oggetto atomica in uno stato non inizializzato.

4

§ 29.6.5 [atomics.types.operations.req] ¶ 4 di N 4140 (il progetto definitivo per il C++ 14) dice:

A ::A() noexcept = default;

Effetti: lascia l'oggetto atomico in uno stato non inizializzato. [Nota: Questi semantica garantire la compatibilità con C. - fine nota]

Si noti che questo non significa che l'oggetto avvolge un valore specificato che si può leggere, ma non dipende dal suo valore. Piuttosto, significa che leggere il valore fuori dall'oggetto prima di assegnarlo comporta un comportamento indefinito.

+1

Essendo non inizializzato è in realtà abbastanza importante qui. Considera cosa succede se metti mmap un blocco di memoria condivisa da un file di database in cui stai usando atomics per bloccare ogni nodo BTree mentre discendi la struttura ad albero. Certamente non vuoi che il tuo codice imposti i valori a zero quando apri il file. –