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

Does the compiler do the same action for all inline function calls?

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.0main函数里面的第一行

int y = func(1) + func(2) + func(3) + func(4);

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

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