_ZNSaIwEC1Ev
_ZNSaIwEC2Ev
这两个 C++ 符号不同但被分解(使用 C++filt 或类似实用程序)为相同的形式:
std::allocator<wchar_t>::allocator()
std::allocator<wchar_t>::allocator()
为什么会这样?可能是解码器的缺陷还是其他原因?
最佳答案
g++ 使用由 Itanium ABI 指定的名称修改方案(和其他实现细节) .
在关于 mangling of constructors and destructors 的部分,我们看到:
<ctor-dtor-name> ::= C1 # complete object constructor
::= C2 # base object constructor
::= C3 # complete object allocating constructor
::= D0 # deleting destructor
::= D1 # complete object destructor
::= D2 # base object destructor
- “完整的对象构造函数”包括
C1
是初始化直接使用的普通构造函数。 - “基本对象构造函数”包括
C2
派生类构造函数使用它来初始化其基类子对象。当涉及虚拟继承时,这可能不同于“完整”构造函数,因为只有完整构造函数会初始化虚拟基类,而基类构造函数会假设它们的虚拟基类已经被初始化。 - “完整的对象分配构造函数”包括
C3
大概包括对operator new
的调用.但据我所知,g++ 从未真正使用过这个。 - “删除析构函数”包括
D0
最后调用适当的标量operator delete
.这是绑定(bind)到虚拟析构函数所必需的,因为正确的operator delete
可能是基类一无所知的静态类成员。 - “完整的对象析构函数”包括
D1
就像C1
的反面构造函数,并包括对虚拟基类的析构函数的调用。 - “基本对象析构函数”包括
D2
就像C2
的反面构造函数,并省略对虚拟基类的析构函数的调用。
所以 C1
和 C2
您询问的一些损坏的名称暗示了对 C++ 系统很重要的信息,必须单独正确链接。但该信息很难在伪代码声明中进行简要解释,因此 demangling 函数只是对两个符号进行相同的描述。
尽管自 std::allocator<T>
通常没有任何虚拟基类,这两个符号很可能实际上指向相同的代码地址,但 g++ 只是提供了两个链接器符号以保持一致性。
关于c++ - 去修饰的 C++ 符号的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49824915/