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