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;
}
编译器会对循环之前的调用和循环内的调用执行相同的操作吗? 如果我们考虑代码长度以及速度优化,那么循环之前的调用不应该内联,内部的调用应该。
答案 0 :(得分:4)
这取决于你的编译器。假设您使用gcc 5.4.0
-O2
优化级别。 main
函数
int y = func(1) + func(2) + func(3) + func(4);
由于整数文字,将在编译时计算,for
循环内的代码将被内联。但是,如果您使用其他编译器或其他优化级别,结果可能会有所不同。
如果您想检查代码的汇编输出,请使用Compiler Explorer这是一个在线免费工具。