2012-11-08 13 views
10

Oto przykładowy kod:Czy stałe statyczne funkcji inline są unikalne?

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]; 
}; 

Ta funkcja jest inline, to w nagłówku wykorzystywane w kilku jednostkach kompilacji. Celem jest sprawienie, aby kompilator nic nie robił, jeśli ta funkcja nie będzie używana.

Pytania:

  1. Czy C++ standardowej gwarancji, że nazwy będą istnieje tylko w jednym pliku wynikowego, czy jest to w lewo, aby kompilator zdecydować, czy też gwarancji, że każdy plik obiekt będzie mieć to kopia?
  2. Jeśli będzie wiele kopii, czy będzie to problem z łączeniem (zakładam, że nie mogę przetestować wystarczającej liczby kompilatorów, aby to sprawdzić).
  3. Czy gcc, msvc i clang zoptymalizują ten przypadek, sprawiając, że ostateczny plik binarny ma tylko jedno wystąpienie NAMES?
+1

Jedno pytanie na pytanie, proszę. –

+2

@LightnessRacesinOrbit: "Yo dawg, słyszałem, że lubisz pytania, więc stawiam pytania w moim pytaniu, abyś mógł odpowiedzieć, podczas gdy ty odpowiesz ..." – Mehrdad

+4

Powiedziałbym, że te pytania są wystarczająco połączone, aby zostać zaksięgowane w jednym pytaniu. – leftaroundabout

Odpowiedz

7

Tak, standard gwarantuje, że będzie tylko jeden obiekt. Spośród takich jak C++ 03 §7.1.2/4:

[...] A static lokalne zmienne w funkcji extern inline zawsze odnosi się do tego samego obiektu. Literał łańcuchowy w zewnętrznej funkcji inline jest tym samym obiektem w różnych jednostkach tłumaczeniowych.

(Należy pamiętać, że funkcja extern inline jest inline funkcja z zewnętrznym łącznikiem, czyli inline funkcję nieoznaczone jako static.)

które dokładnie obiekt File wydaje się zależeć będzie od kompilatora, ale co ja podejrzewa się, że każdy plik obiektowy, który go używa, otrzyma kopię, a linker wybierze dowolnie jeden z symboli i odrzuci resztę.

+0

Co się stanie, jeśli zostanie oznaczone jako statyczne? – imreal

+1

@Nick: Wtedy standard nie daje żadnych gwarancji. –

+0

@Nick: Przypuszczalnie przez "to" masz na myśli funkcję. –

1

Standard gwarantuje, że tylko jedna kopia będzie używana. Nie gwarantuje, że nie zostaną wykorzystane nieużywane kopie zajmujące miejsce w kodzie.

Łącznik jest ogólnie odpowiedzialny za konsolidację wszystkich odniesień do korzystania z tego samego wystąpienia.

Powiązane problemy