编译器C++是否对同一内联函数内联两个不同的调用做出不同的决定?
考虑这样的代码:
inline func(int x) {
return x + (x << 1) + (x << 2) + (x << 3) + (x << 4);
}
int main() {
int y = func(1) + func(2) + func(3) + func(4);
for(int i = 0; i < 100000000; ++i)
y += func(i % 10);
cout << y << endl;
return 0;
}
编译器会对循环之前的调用和循环内的调用执行相同的操作吗?如果我们考虑代码长度和速度优化,那么循环之前的调用不应该内联,而里面的调用应该内联。
这取决于您的编译器。假设您使用具有-O2
优化级别的gcc 5.4.0
。main
函数内的第一行
int y = func(1) + func(2) + func(3) + func(4);
由于整数文本,将在编译时计算,并且 for
循环中的代码将被内联。但是,如果使用其他编译器或其他优化级别,则结果可能会有所不同。
如果要检查代码的程序集输出,请使用编译器资源管理器,这是一个在线免费工具。