2014-12-02 12 views
5

Podobno mam następujące klasy:Dostęp niezainicjowanej zmiennej prywatnej atomowej w C++

class A 
{ 
public: 
... 
... 
void incrementN() {++n_;} 
uint64_t getN() {return n_;} 

private: 
std::atomic<uint64_t> n_; 
... 
... 

}; 

Załóżmy, że mam zainicjować wszystkie inne zmienne w klasie, z wyjątkiem n_ i że nie jest to pamięć lokalna wątku, więc nie ma bez inicjalizacji zerowej.

Tworzę obiekt klasy A i dzwonię pod numer incrementN().

Jeśli w pewnym momencie chcę wartość n_ i wzywam getN(), może to spowodować, że load() rutyna dla atomowej n_ do katastrofy?

+0

Czy masz domyślny konstruktor 'A' lub dowolny konstruktor' A'? Jeśli nie masz żadnych konstruktorów lub domyślnego konstruktora ('A() = default;'), wówczas domyślny konstruktor wygenerowany przez kompilator wywoła domyślny konstruktor wszystkich niestatycznych elementów ([reference] (http: // en .cppreference.com/w/cpp/language/default_constructor)), a domyślny konstruktor '' std :: atomic' (http://en.cppreference.com/w/cpp/atomic/atomic/atomic) będzie nazywa. –

+0

Tak, mam konstruktora dla A i inicjuje inne zmienne A, ale nie inicjuje 'n_' – user1715122

+0

@JoachimPileborg n_ jest domyślnie zainicjowany, obiekt jest skonstruowany, jego wartość jest nieokreślona, ​​więc nie jest to UB. – Rost

Odpowiedz

0

Zmienna n_ member jest po prostu niezainicjowana. Dostęp do pola spowoduje odczyt w pamięci i nie ma powodu do awarii, chociaż układ tych 8 bajtów pamięci nie jest znany.

Fakt, że członek jest atomowy, nie ma tutaj znaczenia. Spowoduje to, że kompilator nie użyje żadnej optymalizacji dla tej konkretnej zmiennej, a także może spowodować eksmisję linii pamięci podręcznej do pamięci RAM przy każdym zapisie.

Powiązane problemy