gcc拒绝内联请求

时间:2015-08-21 09:06:52

标签: c++ gcc inline

#include <iostream>

using namespace std;

inline int square(int n)
{
    return n * n;
}

int main(void)
{
    cout << square(2) << endl;
}

通过使用gcc编译代码我发现编译器仍然将square函数视为简单函数而不是内联函数。

(我查看了汇编代码,在那里我看到了调用square函数。这就是我怎么知道它并没有将它视为内联函数。)

为什么它拒绝我的内联函数的请求,即使它是一个简单的函数? 如果gcc拒绝内联这样一个简单的函数,那么内联关键字的使用是什么?

我可以强制内联函数;那不是问题。我只是想知道为什么gcc拒绝了我的要求。

3 个答案:

答案 0 :(得分:6)

在现代主流编译器中,

inline基本上被忽略了(它只是启用the usual exemption to the ODR for the function)。优化器无论如何都会做他的事情,它可能比你或我更清楚(虽然通常有一些特定于编译器的标志来强制内联函数)。

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

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

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

答案 1 :(得分:1)

您没有在启用优化的情况下进行编译。即使使用-O1,您的代码也会编译为等效的

int main () {
    std::cout << 4;
}

另外,你不担心应该内联什么,不要忘记,让编译器为你做这件事。这是方式更好。 (一如既往,除非您通过测量证明编译器是错误的。)

答案 2 :(得分:0)

使用优化进行编译,例如g++ -O3 ...