GCC 能否优化具有相同主体的函数的代码大小?

Can GCC optimize code size for functions with the same body?

本文关键字:函数 代码 主体 优化 GCC      更新时间:2023-10-16

我正在使用GDB调试一个C++程序,并面临不同的功能结果是相同的。这就是我的意思:

some.hpp

class Base{
virtual bool foo() const;
virtual bool bar() const;
}

some.cpp

bool Base::foo() const {
return false;
}
bool Base::bar() const {
return false;
}

问题是在 gdb 中我看到以下内容:

(gdb) p someBaseObject->foo
$1 = {bool (const Base * const)} 0xdeadf00d <Base::foo() const>
(gdb) p someBaseObject->bar
$2 = {bool (const Base * const)} 0xdeadf00d <Base::foo() const>

我想GCC优化了这两个函数以节省代码大小。是吗?不过,这会使调试变得复杂...

如果您想知道如何编译某些内容,那么查看编译器资源管理器通常非常有帮助。

这是您的代码(调用两个函数( https://gcc.godbolt.org/z/g2hfcA

为"过程间优化相同代码折叠"启用编译器标志时,-fipa-icf允许编译器替换相同的函数。这会导致bar在程序集中消失。如果您使用-O3进行编译,这也将被激活。

海湾合作委员会关于-fipa-icf的文件:

-

FIPA-ICF:

对函数和只读变量执行相同的代码折叠。优化可减少代码大小,并可能干扰展开 通过将一个函数替换为一个等效的函数来堆叠 名字。优化在链接时间下更有效 已启用优化。

虽然行为类似于金链的ICF 优化,GCC ICF在不同级别上工作,因此 优化不一样 - 发现等效 只有海湾合作委员会和黄金才能找到的等价物。

默认情况下,此标志在 -O2 和 -OS 处启用。