C++链接器是否会自动内联“传递”函数,这些函数在头文件中没有定义,并且没有明确要求通过inline
关键字“内联”?C++链接器会自动内联函数(没有“inline”关键字,没有在头文件中实现)?
例如,发生以下情况经常,并应始终受益于“内联”,这似乎是每一个编译器供应商应具备“自动”处理,这是通过“内联”通过连接(在这些在有可能的情况下):
//FILE: MyA.hpp
class MyA
{
public:
int foo(void) const;
};
//FILE: MyB.hpp
class MyB
{
private:
MyA my_a_;
public:
int foo(void) const;
};
//FILE: MyB.cpp
// PLEASE SAY THIS FUNCTION IS "INLINED" BY THE LINKER, EVEN THOUGH
// IT WAS NOT IMPLICITLY/EXPLICITLY REQUESTED TO BE "INLINED"?
int MyB::foo(void)
{
return my_a_.foo();
}
我知道的MSVS连接器将通过其链接时代码生成(LTGCC)执行一些“内联”,那GCC工具链也支持链接时间优化(LTO)(见:Can the linker inline functions?)。另外,我知道有些情况下这个不能被“内联”,比如当实现对链接器不可用时(例如,跨越共享库边界,发生单独链接) 。
但是,如果这是代码链接到不交叉DLL /共享-lib的边界的单个可执行,我期望编译器/链接器厂商自动内联的功能,作为一个简单明显的优化(兼顾性能和体积)?
我的希望太天真了吗?
我不知道这里是否内联发生(我是积极的可以),但它不是一个明显的*** omtimization。太多的内联可以实际上减慢你的程序的速度 –
但是,在这种情况下,不是'inline' *总是*更小更快的结果?这不是一个简单的“函数调用 - 展开”,它不会在文本段中强制分页,并且不会增加堆栈的开销? (这只是一个嵌套函数调用的“展开”,*必须*仍然会从父上下文中调用。) – charley
@charley如果调用某个函数所需的指令大于该函数,那么它将始终更小并且更快。这就是为什么如果你有优化,编译器几乎肯定会内联。 –