编译器是否对所有内联函数调用执行相同的操作?

时间:2017-06-08 19:22:13

标签: c++ compiler-optimization inline-functions

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;
}

编译器会对循环之前的调用和循环内的调用执行相同的操作吗? 如果我们考虑代码长度以及速度优化,那么循环之前的调用不应该内联,内部的调用应该。

1 个答案:

答案 0 :(得分:4)

这取决于你的编译器。假设您使用gcc 5.4.0 -O2优化级别。 main函数

中的第一行
int y = func(1) + func(2) + func(3) + func(4);
由于整数文字,

将在编译时计算,for循环内的代码将被内联。但是,如果您使用其他编译器或其他优化级别,结果可能会有所不同。

如果您想检查代码的汇编输出,请使用Compiler Explorer这是一个在线免费工具。