C++ 函数名称分解:这个名称后缀是什么意思?
C++ function name demangling: What does this name suffix mean?
当我反汇编 Chromium 二进制文件时,我注意到有一些函数以这种模式命名:
_ZN6webrtc15DecoderDatabase11DecoderInfoD2Ev.part.1
如果我把这个字符串给c++filt,输出是
webrtc::DecoderDatabase::DecoderInfo::~DecoderInfo() [clone .part.1]
那么这个 .part.1 后缀到底是什么意思?如果它表明同一个函数有多个副本,他们为什么需要那个?是因为位置独立的要求吗?我使用 g++ 作为编译器。
这表明析构函数是 GCC partial inlining optimization 的目标。通过这种优化,函数只是部分内联到另一个函数中,其余部分被发送到它自己的部分函数中。由于这个新的部分函数没有实现完整函数,因此它被赋予了不同的名称,因此如果需要,它可以存在于完整函数的定义旁边。
因此,例如 DecoderDatabase::DecoderInfo::~DecoderInfo 的定义如下:
DecoderDatabase::DecoderInfo::~DecoderInfo() {
if (!external) delete decoder;
}
我的猜测是 delete decoder
调用了一长串操作,太长而无法内联到另一个函数中。优化器会相应地将这些操作拆分为部分函数。然后它只会将函数的 if (!external)
部分内联到其他函数中。
当我反汇编 Chromium 二进制文件时,我注意到有一些函数以这种模式命名:
_ZN6webrtc15DecoderDatabase11DecoderInfoD2Ev.part.1
如果我把这个字符串给c++filt,输出是
webrtc::DecoderDatabase::DecoderInfo::~DecoderInfo() [clone .part.1]
那么这个 .part.1 后缀到底是什么意思?如果它表明同一个函数有多个副本,他们为什么需要那个?是因为位置独立的要求吗?我使用 g++ 作为编译器。
这表明析构函数是 GCC partial inlining optimization 的目标。通过这种优化,函数只是部分内联到另一个函数中,其余部分被发送到它自己的部分函数中。由于这个新的部分函数没有实现完整函数,因此它被赋予了不同的名称,因此如果需要,它可以存在于完整函数的定义旁边。
因此,例如 DecoderDatabase::DecoderInfo::~DecoderInfo 的定义如下:
DecoderDatabase::DecoderInfo::~DecoderInfo() {
if (!external) delete decoder;
}
我的猜测是 delete decoder
调用了一长串操作,太长而无法内联到另一个函数中。优化器会相应地将这些操作拆分为部分函数。然后它只会将函数的 if (!external)
部分内联到其他函数中。