2013-09-03 7 views
5

przypadek testowy następująco:Dlaczego g ++ generuje dwa konstruktory z różnymi manglingami nazw?

// test.cpp 
class X { 
public: 
    X(); 
}; 

X::X() { } 

void foo() { 
    X x; 
} 

skompilować i czytać symbole w pliku obiektu tak:

[[email protected] tmp]# g++ -c test.cpp 

[[email protected] tmp]# readelf -s -W test.o 

Symbol stół '.symtab' zawiera 12 pozycje:

Num: Wartość Rozmiar Typ Powiąż Vis Ndx Nazwa

0: 0000000000000000  0 NOTYPE LOCAL DEFAULT UND 
1: 0000000000000000  0 FILE LOCAL DEFAULT ABS test.cpp 
2: 0000000000000000  0 SECTION LOCAL DEFAULT 1 
3: 0000000000000000  0 SECTION LOCAL DEFAULT 3 
4: 0000000000000000  0 SECTION LOCAL DEFAULT 4 
5: 0000000000000000  0 SECTION LOCAL DEFAULT 6 
6: 0000000000000000  0 SECTION LOCAL DEFAULT 7 
7: 0000000000000000  0 SECTION LOCAL DEFAULT 5 
8: 0000000000000000 10 FUNC GLOBAL DEFAULT 1 _ZN1XC2Ev => X::X() 
9: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND __gxx_personality_v0 
10: 0000000000000000 10 FUNC GLOBAL DEFAULT 1 _ZN1XC1Ev => X::X() 
11: 000000000000000a 22 FUNC GLOBAL DEFAULT 1 _Z3foov 

[[email protected] tmp]# c++filt _ZN1XC1Ev 

X::X() 

[[email protected] tmp]# c++filt _ZN1XC2Ev 

X::X() 

Dlaczego g ++ wygenerować dwa konstruktory o różnych nazwach manglingów (_ZN1XC1Ev i _ZN1XC2Ev)?

+1

Niektóre kompilatory generują dwa konstruktory, jeden zadzwonić z programów użytkownika i jeden zadzwonić kiedy jest stosowany jako baza klasa innego obiektu, ponieważ czasami istnieją pewne różnice w tym, co należy zrobić. Jestem trochę niejasna w szczegółach i nie wiem, czy tak jest w tym przypadku, więc może to być całkowicie błędne, a więc to komentarz nie jest odpowiedzią :) – jcoder

Odpowiedz

0

Jest to znana wada z G ++. Patrz Known g++ bugs

 G++ emits two copies of constructors and destructors. 
    In general there are three types of constructors (and destructors). 

    1.The complete object constructor/destructor. 
    2.The base object constructor/destructor. 
    3.The allocating constructor/deallocating destructor. 

    The first two are different, when virtual base classes are involved. 

Jeśli chcesz dowiedzieć się więcej o tych trzech rodzajów ctors i dtors patrz link

Powiązane problemy