2013-09-03 6 views
5

テストケースを次のようg ++が異なる名前のmanglingsを持つ2つのコンストラクタを生成するのはなぜですか?

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

X::X() { } 

void foo() { 
    X x; 
} 

はそれをコンパイルし、このようなオブジェクト・ファイル内のシンボルを読み取る:

民:

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

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

シンボルテーブル 'の.symtab' は12件のエントリが含まれています。値の種類タイプバインド可視Ndx名

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

なぜg ++異なる名前のmangings(_ZN1XC1Ev_ZN1XC2Ev)を持つ2つのコンストラクタを生成しますか?

+1

いくつかのコンパイラは、呼び出すために、2つのユーザプログラムから呼び出すためのコンストラクタ、1と1を生成する参照してください。いくつかの違いがあることがあるので、時には何が行われる必要があるかのように、別のオブジェクトのクラス。私は細部には少し漠然としていて、それがここにあるのかどうかわからないので、これは完全に間違っているかもしれません。したがって、それは答えではありません:) – jcoder

答えて

0

G ++の既知の不具合です。あなたはctorsとdtorsのこの3種類の詳細をお知りになりたい場合は、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. 

を参照してくださいベースとして使用する場合link

関連する問題