使用 gcc v4.8.1
如果我做:
//func.hpp
#ifndef FUNC_HPP
#define FUNC_HPP
int func(int);
#endif
//func.cpp
#include "func.hpp"
int func(int x){
return 5*x+7;
}
//main.cpp
#include <iostream>
#include "func.hpp"
using std::cout;
using std::endl;
int main(){
cout<<func(5)<<endl;
return 0;
}
即使是简单的函数func
也不会被内联。inline
原型和/或定义上的, extern
,static
和的组合__attribute__((always_inline))
不会改变这一点(显然这些说明符的某些组合会导致它甚至无法编译和/或产生警告,而不是谈论那些)。我正在使用g++ *.cpp -O3 -o run
和g++ *.cpp -O3 -S
汇编输出。当我查看汇编输出时,我仍然看到call func
. 似乎我可以正确内联函数的唯一方法是在头文件中拥有原型(可能不是必需的)和函数的定义。如果标头仅包含在整个程序中的一个文件中(仅包含在main.cpp
示例中),它将编译并且函数将被正确内联,甚至不需要inline
说明符。如果标题要包含在多个文件中,则inline
说明符似乎是解决多个定义错误所必需的,这似乎是它的唯一目的。该函数当然是正确内联的。
所以我的问题是:我做错了吗?我错过了什么吗?不管发生了什么:
“编译器比你聪明。它比你更清楚什么时候应该内联函数。永远不要使用 C 数组。总是使用 std::vector!”
- 其他 StackOverflow 用户
真的吗?那么调用 func(5) 并打印结果比打印 32 更快吗?我会盲目地跟着你走出悬崖边上,全知全能,全知全能的 gcc。
为了记录,上面的代码只是一个例子。我正在编写一个光线追踪器,当我将我的数学和其他实用程序类的所有代码移动到它们的头文件并使用说明inline
符时,我看到了巨大的性能提升。从字面上看,某些场景的速度快了 10 倍。