У меня есть такой класс:
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
// more stuff
};
Обычно я хочу по умолчанию (ноль) инициализировать counts
массив, как показано.
Однако в выбранных местах, определенных профилированием, я хотел бы подавить инициализацию массива, потому что я знаю, что массив собирается быть перезаписан, но компилятор не достаточно умен, чтобы понять это.
Какой идиоматичный и эффективный способ создать такой «вторичный» конструктор с нулевым аргументом?
В настоящее время я использую класс тега, uninit_tag
который передается как фиктивный аргумент, например:
struct uninit_tag{};
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
event_counts(uninit_tag) {}
// more stuff
};
Затем я вызываю конструктор без инициализации, например, event_counts c(uninit_tag{});
когда я хочу подавить конструкцию.
Я открыт для решений, которые не включают создание фиктивного класса, или более эффективны в некотором роде, и т. Д.