#include <iostream>
using namespace std;
inline int square(int n)
{
return n * n;
}
int main(void)
{
cout << square(2) << endl;
}
Run Code Online (Sandbox Code Playgroud)
通过使用gcc编译代码,我发现编译器仍然将square函数视为简单函数而不是inline.
(我查看了汇编代码,在那里我看到了对square函数的调用.这就是我所知道的并不是将它视为内联函数.)
为什么即使它是一个简单的函数,否认我的内联函数请求?如果gcc拒绝内联这样一个简单的函数那么内联关键字的用途是什么?
我可以强制内联函数; 那不是问题.我只是想知道为什么gcc拒绝了我的要求.
inline在现代主流编译器中基本上被忽略了(它只是为函数提供了对ODR的通常豁免).优化器无论如何都会做他的事情,它可能比你或我更清楚(虽然通常有一些特定于编译器的标志来强制内联函数).
无论如何,可能你没有看到任何内联,因为你编译时禁用了优化 - 在调试中经常使用的设置,其中内联和其他优化使得源代码行与编译代码不匹配(从而在调试器中逐步完成).-O3在我的机器上启用优化(g ++ 4.8.4)使函数完全消失 - 4在编译时完全评估result().
总结一下:目前,重点inline是允许您在多个翻译单元中提供函数定义,而不会出现多个函数定义的链接器错误.
这很有用,因为如果你有一个很好的内联候选者,你想把它放到一个头文件中(这样编译每个.cpp编译器就可以立即看到它的定义,并立即内联扩展它 - 链接时代码生成只是最近的一件事)但是你希望链接器知道出现的额外非inline副本是指同一个东西,并且可以安全地丢弃(将它们标记为static会导致每个TU中不必要的代码重复).