Powiedzmy mam klasy z tablicy członkowskim std::atomic
s, gdzie tablica jest zwymiarowany za pomocą obliczeń (to znaczy może się zmieniać na podstawie innych stałych gdzie indziej w programie):Jak elegancko zainicjować tablicę std :: atomic?
class Foo {
static constexpr size_t kArraySize = ComputeArraySize();
std::atomic<size_t> atomics_[kArraySize];
};
Jaki jest najbardziej elegancki sposób, aby upewnić się, że wszystkie atomy zostały zainicjowane na zero? Czy mogę zrobić lepiej niż zapętlanie się tablicy w konstruktorze Foo
i jawnie przechowujące zero? Czy odpowiedź różni się dla std::array
?
Zwykle użyłbym inicjatora nawiasów klamrowych tutaj, ale długość pochodna (która może być długa) utrudnia.
Należy pamiętać, że nie można założyć, że instancja Foo
ma czas przechowywania statycznego .
Zadeklaruj jako 'std :: atomic atomics_ [kArraySize] = {};'? Nie jestem pewien, jakie są reguły dla inicjowania atomów. –
... To nic nie robić. Wszystko statyczne jest inicjowane od zera podczas uruchamiania programu. –
@Ryan Haining: Tak, to działa dla zwykłej tablicy w stylu C. Wydaje się nie działać dla 'std :: array, N>' chociaż, chociaż standard wydaje się mówić, że powinien. @ n.m .: "Nie mogę założyć, że instancja Foo ma czas przechowywania statycznego". –
jacobsa