Ich habe eine Klasse wie diese:
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
// more stuff
};
Normalerweise möchte ich das counts
Array standardmäßig (Null) wie gezeigt initialisieren .
An ausgewählten Stellen, die durch Profilerstellung identifiziert wurden, möchte ich jedoch die Array-Initialisierung unterdrücken, da ich weiß, dass das Array bald überschrieben wird, der Compiler jedoch nicht intelligent genug ist, um dies herauszufinden.
Was ist eine idiomatische und effiziente Methode, um einen solchen "sekundären" Null-Arg-Konstruktor zu erstellen?
Derzeit verwende ich eine Tag-Klasse, uninit_tag
die wie folgt als Dummy-Argument übergeben wird:
struct uninit_tag{};
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
event_counts(uninit_tag) {}
// more stuff
};
Dann rufe ich den No-Init-Konstruktor auf, wie event_counts c(uninit_tag{});
wenn ich die Konstruktion unterdrücken möchte.
Ich bin offen für Lösungen, bei denen keine Dummy-Klasse erstellt wird oder die in irgendeiner Weise effizienter sind usw.