Ho una lezione come questa:
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
// more stuff
};
Di solito, per impostazione predefinita, voglio inizializzare (zero) l' counts
array come mostrato.
In posizioni selezionate identificate dalla profilazione, tuttavia, vorrei sopprimere l'inizializzazione dell'array, perché so che l'array sta per essere sovrascritto, ma il compilatore non è abbastanza intelligente da capirlo.
Qual è un modo idiomatico ed efficiente per creare un costruttore "secondario" a zero-arg?
Attualmente sto usando una classe di tag uninit_tag
che viene passata come argomento fittizio, in questo modo:
struct uninit_tag{};
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
event_counts(uninit_tag) {}
// more stuff
};
Quindi chiamo il costruttore no-init come event_counts c(uninit_tag{});
quando voglio sopprimere la costruzione.
Sono aperto a soluzioni che non comportano la creazione di una classe fittizia o che sono più efficienti in qualche modo, ecc.