2013-09-03 13 views
5

caso di test come segue:Perchè g ++ genera due costruttori con differenti manomissioni di nome?

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

X::X() { } 

void foo() { 
    X x; 
} 

compilarlo e leggere i simboli nel file oggetto in questo modo:

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

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

Simbolo tabella '.symtab' contiene 12 voci:

Num: Valore Dimensione Tipo Bind Vis Ndx Nome

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() 

Perché g ++ generare due costruttori con differenti nome manglings (_ZN1XC1Ev e _ZN1XC2Ev)?

+1

Alcuni compilatori generano due costruttori, uno per chiamare da programmi utente e uno da chiamare quando viene utilizzato come base classe di un altro oggetto in quanto vi sono alcune differenze a volte in ciò che deve essere fatto. Sono un po 'vago sui dettagli e non so se è anche il caso qui, quindi questo potrebbe essere completamente sbagliato, e quindi è un commento non una risposta :) – jcoder

risposta

0

È un difetto noto da G ++. Fare riferimento 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. 

Se vuoi sapere di più su questo tre tipi di ctors e dtors, riferiscono link

Problemi correlati