Mam taką klasę:
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
// more stuff
};
Zwykle chcę domyślnie (zero) zainicjować counts
tablicę, jak pokazano.
Jednak w wybranych lokalizacjach zidentyfikowanych przez profilowanie chciałbym powstrzymać inicjalizację tablicy, ponieważ wiem, że tablica wkrótce zostanie zastąpiona, ale kompilator nie jest wystarczająco inteligentny, aby to rozgryźć.
Jaki jest idiomatyczny i skuteczny sposób stworzenia takiego „wtórnego” konstruktora zero-arg?
Obecnie używam klasy znaczników, uninit_tag
która jest przekazywana jako fikcyjny argument, na przykład:
struct uninit_tag{};
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
event_counts(uninit_tag) {}
// more stuff
};
Następnie wywołuję konstruktor bez inicjacji, tak jak event_counts c(uninit_tag{});
gdy chcę wyłączyć konstrukcję.
Jestem otwarty na rozwiązania, które nie wymagają stworzenia sztucznej klasy lub są w jakiś sposób bardziej wydajne itp.