GCC拒绝内联请求

gcc denying inline request

本文关键字:请求 拒绝 GCC      更新时间:2023-10-16
#include <iostream>
using namespace std;
inline int square(int n)
{
    return n * n;
}
int main(void)
{
    cout << square(2) << endl;
}

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

(我检查了汇编代码,在那里我看到对平方函数的调用。这就是为什么我知道它没有将它视为内联的。)

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

我可以强制内联函数;这不是问题所在。我只是想知道为什么gcc拒绝我的请求。

inline在现代主流编译器上基本上是被忽略的(它只是允许对函数的ODR进行通常的豁免)。优化器无论如何都会做他的事情,而且它可能比你我更清楚(尽管通常有一些特定于编译器的标志来强制函数内联)。

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


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

这是有用,因为如果你有一个很好的候选人内联你想把它放到头文件(这样编译每个.cpp编译器可以马上看到它的定义,并扩大它内联马上——链接时代码生成只是最近的事情)但是你想让链接器知道额外的非inline副本参考都出现同样的事情,并且可以丢弃安全(将它们标记为static会导致不必要的代码重复在每个你)。

编译时没有启用优化。即使使用-O1,您的代码也会编译为相当于

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

同样,不要担心哪些应该内联,哪些不应该,让编译器为你做这些。它方式好。(一如既往,除非您通过度量证明编译器是错误的。)

编译优化,例如g++ -O3 ...