【问题标题】:C++ function name demangling: What does this name suffix mean?C++ 函数名称拆解:这个名称后缀是什么意思?
【发布时间】:2015-07-28 18:03:24
【问题描述】:

当我反汇编 Chromium 二进制文件时,我注意到有以这种模式命名的函数: _ZN6webrtc15DecoderDatabase11DecoderInfoD2Ev.part.1

如果我将此字符串提供给 c++filt,则输出为 webrtc::DecoderDatabase::DecoderInfo::~DecoderInfo() [clone .part.1]

那么这个 .part.1 后缀的真正含义是什么?如果它表明同一个函数有多个副本,他们为什么需要那个?是因为位置独立的要求吗?我使用 g++ 作为编译器。

【问题讨论】:

  • 函数可能被不同的参数签名重载。
  • @πάνταῥεῖ:也有析构函数?
  • 我只是猜测,但我敢打赌这是一种优化。它不是在多个函数中发出相同的代码块,而是发出一个公共代码块和几个调用它的存根。对于析构函数来说尤其如此,可以通过多种方式调用(例如,子类与通过delete)。
  • @πάνταῥεῖ 我知道这一点。在这种情况下,函数具有不同的重命名。但这并不能解释“.part.1”的事情。

标签: c++ assembly g++ chromium


【解决方案1】:

这表明析构函数是 GCC 的 partial inlining optimization 的目标。通过这种优化,该函数仅部分内联到另一个函数中,其余部分被发送到它自己的部分函数中。由于这个新的部分函数没有实现完整函数,因此它被赋予了不同的名称,因此如果需要,它可以存在于完整函数的定义旁边。

例如,DecoderDatabase::DecoderInfo::~DecoderInfo 的定义如下:

DecoderDatabase::DecoderInfo::~DecoderInfo() {
    if (!external) delete decoder;
}

我的猜测是delete decoder 调用了一长串操作,太长而无法内联到另一个函数中。优化器会相应地将这些操作拆分为部分函数。然后它只会将函数的 if (!external) 部分内联到其他函数中。

【讨论】:

  • 有趣。我以前没有听说过部分内联。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多