C++ gcc拒绝内联请求 #包括 使用名称空间std; 内联整数平方(整数n) { 返回n*n; } 内部主(空) { cout

C++ gcc拒绝内联请求 #包括 使用名称空间std; 内联整数平方(整数n) { 返回n*n; } 内部主(空) { cout,c++,gcc,inline,C++,Gcc,Inline,inline在现代主流编译器上基本上被忽略(它只是启用)。优化器无论如何都会做他的事情,而且它可能比您或我更清楚(尽管通常有一些编译器特定的标志来强制函数内联) 无论如何,您可能在那里看不到任何内联,因为您在编译时禁用了优化—这是调试中经常使用的设置,内联和其他优化使得无法将源代码行与编译后的代码匹配(从而在调试器中逐步执行)。在我的机器上启用优化-O3(g++4.8.4)使函数完全消失-结果(4)在编译时完全计算 总结:目前,inline的要点是允许您在多个翻译单元中提供函数定义,而不会在函

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

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


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


这是非常有用的,因为如果您有一个很好的内联候选对象,您希望将其放入头文件中(这样编译每个
.cpp
编译器可以立即查看其定义,并立即内联扩展它-链接时代码生成只是最近的事情)但是您希望链接器知道,出现的额外非
内联
副本引用的都是相同的内容,可以安全地丢弃(将它们标记为
静态
将导致每个TU中不必要的代码重复)。

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

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


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


这是非常有用的,因为如果您有一个很好的内联候选对象,您希望将其放入头文件中(这样编译每个
.cpp
编译器可以立即查看其定义,并立即内联扩展它-链接时代码生成只是最近的事情)但是您希望链接器知道,产生的额外非
内联
副本都指向同一事物,可以安全地丢弃(将它们标记为
静态
将导致每个TU中不必要的代码重复)

#include <iostream>

using namespace std;

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

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

std::cout您不是在启用优化的情况下编译的。即使使用
-O1
您的代码编译为

#include <iostream>

using namespace std;

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

int main(void)
{
    cout << square(2) << endl;
}
int main(){
std::无法复制的可能副本的可能副本