Hier ist ein Beispielcode:Sind statische Konstanten der Inline-Funktion eindeutig?
enum Foo // or enum class whatever
{ BAR
, STUFF
};
inline const char* to_string(const Foo& foo)
{
static const char* const NAMES[] =
{ "BAR"
, "STUFF"
};
// let's assume I have some boundary checks here, it's not the point
return NAMES[foo];
};
Diese Funktion inline ist, ist in einem Header in mehreren Übersetzungseinheiten verwendet. Das Ziel hier ist, den Compiler nichts tun zu lassen, wenn diese Funktion nicht verwendet wird.
Fragen:
- Hat der Standardgarantie C++, die Namen werden nur eine Objektdatei in vorhanden ist, oder ist es dem Compiler überlassen, zu entscheiden oder keine Garantie dafür, dass jede Objektdatei es Kopie ist haben wird?
- Wenn es mehrere Kopien gibt, wird es ein Verknüpfungsproblem sein (ich nehme an, ich kann nicht genügend Compiler testen, um das zu überprüfen).
- Werden gcc, msvc und clang diesen Fall optimieren, indem die letzte Binärdatei nur eine Instanz von NAMES enthält?
Eine Frage pro Frage, bitte. –
@LightnessRacesinOrbit: "Yo dawg, ich habe gehört, du magst Fragen, also stelle ich Fragen in meine Frage, damit du antworten kannst, während du antwortest ..." – Mehrdad
Ich würde sagen, dass diese Fragen ausreichend miteinander verbunden sind, um in einer einzigen Frage gepostet zu werden. – leftaroundabout