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



编译器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 循环中的代码将被内联。但是,如果使用其他编译器或其他优化级别,则结果可能会有所不同。

如果要检查代码的程序集输出,请使用编译器资源管理器,这是一个在线免费工具。

相关内容

  • 没有找到相关文章

最新更新