Diciamo che ho una classe con una serie membro del std::atomic
s, in cui la matrice è dimensionato tramite un calcolo (vale a dire che possono cambiare in base su altre costanti altrove nel programma):Come inizializzare elegantemente una matrice di std :: atomic?
class Foo {
static constexpr size_t kArraySize = ComputeArraySize();
std::atomic<size_t> atomics_[kArraySize];
};
Qual è la il modo più elegante per garantire che gli atomici siano tutti inizializzati su zero? Posso fare meglio del loop sull'array nel costruttore di Foo
e nello che memorizza in modo esplicito zero? La risposta è diversa per std::array
?
Normalmente userei un inizializzatore di controventi, ma la lunghezza derivata (che può essere lunga) rende difficile.
Si noti che non è possibile presumere che l'istanza di Foo
abbia una durata di memorizzazione statica .
declare come 'std :: atomic atomics_ [kArraySize] = {};'? Non sono sicuro di quali siano le regole per l'inizializzazione atomica –
... È di non fare nulla. Tutto ciò che è statico è inizializzato a zero all'avvio del programma. –
@Ryan Haining: Sì, funziona per un semplice array in stile C. Non sembra funzionare per 'std :: array, N>' sebbene, anche se lo standard sembra dire che dovrebbe. @ n.m .: "Si noti che non posso assumere che l'istanza di Foo abbia una durata di archiviazione statica". –
jacobsa