gpt4 book ai didi

c++ - 去修饰的 C++ 符号的歧义

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:00 27 4
gpt4 key购买 nike

_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 的反面构造函数,并省略对虚拟基类的析构函数的调用。

所以 C1C2您询问的一些损坏的名称暗示了对 C++ 系统很重要的信息,必须单独正确链接。但该信息很难在伪代码声明中进行简要解释,因此 demangling 函数只是对两个符号进行相同的描述。

尽管自 std::allocator<T>通常没有任何虚拟基类,这两个符号很可能实际上指向相同的代码地址,但 g++ 只是提供了两个链接器符号以保持一致性。

关于c++ - 去修饰的 C++ 符号的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49824915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com