_ZNSaIwEC1Ev
_ZNSaIwEC2Ev
Run Code Online (Sandbox Code Playgroud)
这两个C++符号不同,但是将它们(使用C++ filt或类似实用程序)解压缩为相同的形式:
std::allocator<wchar_t>::allocator()
std::allocator<wchar_t>::allocator()
Run Code Online (Sandbox Code Playgroud)
为什么这样?它可能是一个demangler的缺陷还是其他什么?
g ++使用Itanium ABI指定的名称修改方案(以及其他实现细节).
在关于构造函数和析构函数的修改的部分中,我们看到:
<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
Run Code Online (Sandbox Code Playgroud)
C1初始化直接使用的普通构造函数.C2由派生类构造函数用于初始化其基类子对象.当涉及虚拟继承时,这可能与"完整"构造函数不同,因为只有完整构造函数初始化虚拟基础,而基础构造函数则假设其虚拟基础已经初始化.C3可能包括调用operator new.但据我所知,g ++从未真正使用过这个.D0调用适当的标量operator delete.这是绑定到虚拟析构函数所必需的,因为正确的operator delete可能是基类不知道的静态类成员.D1与C1构造函数的反向相似,并包括对虚拟基类的析构函数的调用.D2与C2构造函数的反向相似,并省略对虚拟基类的析构函数的调用.因此,您询问的错误名称C1和C2隐含的信息对C++系统很重要,必须单独正确链接.但是这些信息很难在伪代码声明中简要解释,因此demangling函数只是相同地描述了两个符号.
虽然由于std::allocator<T>通常没有任何虚拟基类,但这两个符号实际上可能指向相同的代码地址,但g ++只提供两个链接符号以保持一致性.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |