【发布时间】:2010-09-05 17:44:15
【问题描述】:
关于关键字inline,我有一个discussion 和Johannes Schaub。
那里的代码是这样的:
namespace ... {
static void someFunction() {
MYCLASS::GetInstance()->someFunction();
}
};
他说:
把它作为一个内联函数可能 在可执行文件中保存代码大小
- 只有在编译器的成本/收益分析表明它是有利可图的情况下才会发生[内联]
- 主流 C++ 编译器(如 Microsoft Visual C++ 和 GCC)支持一个选项,允许编译器自动内联任何合适的函数,即使是那些未标记为内联函数的函数。
然而,Johannes 指出,明确指定它还有其他好处。不幸的是,我不明白他们。例如,他说并且“内联”允许您在程序中多次定义函数。,我很难理解(并找到参考)。
所以
-
inline只是对编译器的建议吗? - 当你有一个小功能时是否应该明确说明(我猜是1-4条指令?)
- 写
inline还有什么其他好处? - 是否需要声明
inline以减少可执行文件的大小,即使编译器(根据维基百科 [我知道,错误的参考])应该自己找到这些函数?
我还有什么遗漏的吗?
【问题讨论】:
-
仅供参考,内联通常增加可执行文件大小,因为每次内联时都会复制代码。希望获得的收益是更快的执行速度,而不是减小文件大小。
-
我所说的是与“静态”相比。请在回答之前阅读该评论线程和该静态函数:如果您将静态函数放入标题中并以无法使用内联的方式使用它,并且如果您将标记为“内联”的非静态函数放入标头并以无法使用内联的方式使用它,那么内联版本将在最终程序中占用更少的空间,因为标准要求 函数在任何地方都具有相同的地址 ,所以在最终程序中,只有一个代码副本,而不是“静态”版本。
-
@John:但是内联还允许优化器一次“看到”更多代码,让它有更多的时间去咀嚼。通常这实际上会导致更小代码。对于模板元编程尤其如此,其中内联通常会消除(编译时)递归函数调用。
-
@Johannes Schaub :该标准仅要求将函数的地址两次获取等效值,而不是代码的单个副本。事实上,内联的全部意义在于将多个代码副本嵌入到其他函数中(从而占用代码空间)
-
@MSalters 我很难想象这样的实现,因为它实际上会复制完全相同的代码。这与 C99 的语义不同,其中函数的内联定义和外部定义可以有不同的行为,但仍需要具有相同的地址。因此,C99 在获取地址时会退回到外部定义,否则可能会使用内联定义(但不一定内联调用)。但是,C++ 中不存在这样的东西。这里的内联函数只有一种行为。请注意,我假设调用是 not 内联的。
标签: c++ compiler-construction inline