gcc拒绝内联请求

Lok*_*esh 1 c++ gcc inline

#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拒绝了我的要求.

Mat*_*lia 6

inline在现代主流编译器中基本上被忽略了(它只是为函数提供了对ODR的通常豁免).优化器无论如何都会做他的事情,它可能比你或我更清楚(虽然通常有一些特定于编译器的标志来强制内联函数).

无论如何,可能你没有看到任何内联,因为你编译时禁用了优化 - 在调试中经常使用的设置,其中内联和其他优化使得源代码行与编译代码不匹配(从而在调试器中逐步完成).-O3在我的机器上启用优化(g ++ 4.8.4)使函数完全消失 - 4在编译时完全评估result().


总结一下:目前,重点inline是允许您在多个翻译单元中提供函数定义,而不会出现多个函数定义的链接器错误.

这很有用,因为如果你有一个很好的内联候选者,你想把它放到一个头文件中(这样编译每个.cpp编译器就可以立即看到它的定义,并立即内联扩展它 - 链接时代码生成只是最近的一件事)但是你希望链接器知道出现的额外非inline副本是指同一个东西,并且可以安全地丢弃(将它们标记为static会导致每个TU中不必要的代码重复).