2012-11-08 13 views
10

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:

  1. 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?
  2. 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).
  3. Werden gcc, msvc und clang diesen Fall optimieren, indem die letzte Binärdatei nur eine Instanz von NAMES enthält?
+1

Eine Frage pro Frage, bitte. –

+2

@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

+4

Ich würde sagen, dass diese Fragen ausreichend miteinander verbunden sind, um in einer einzigen Frage gepostet zu werden. – leftaroundabout

Antwort

7

Ja, der Standard garantiert, dass nur ein Objekt vorhanden ist. Von C++ 03 §7.1.2/4:

[...] Ein static lokale Variable in einer extern inline Funktion bezieht sich immer auf das gleiche Objekt. Ein String-Literal in einer externen Inline-Funktion ist das gleiche Objekt in verschiedenen Übersetzungseinheiten.

(Beachten Sie, dass eine extern inline Funktion eine inline Funktion mit externer Bindung ist, dh eine inline Funktion nicht als static markiert.)

Genau, die es auf dem Compiler erscheint in File-Objekt hängen, aber was ich Der verdächtige Fall ist, dass jede Objektdatei, die sie verwendet, eine Kopie erhält, und der Linker wird willkürlich eines der Symbole auswählen und den Rest verwerfen.

+0

Was passiert, wenn es als statisch markiert ist? – imreal

+1

@Nick: Dann gibt der Standard keine Garantien. –

+0

@Nick: Vermutlich von "it" meinst du die Funktion. –

1

Der Standard garantiert, dass nur eine Kopie verwendet wird. Es garantiert nicht, dass nicht unbenutzte Kopien Platz im Code einnehmen.

Der Linker ist in der Regel verantwortlich für die Konsolidierung aller Verweise auf die gleiche Instanz zu verwenden.

Verwandte Themen