编译器是否优化内联函数的局部变量

shi*_*zhi 0 c++ compilation

现在我读了这本书Inside The C++ Object Model的第四部分并提出了一些问题.

像这样的内联函数:

inline int max(int a, int b)
{
    return (a > b) ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

然后,声明如下: a = max(x, y);

这句话将转变为 a = (x > y) ? x : y;

但是这本书说当在内联函数中添加局部变量时,如下所示:

inline int max(int a, int b)
{
    int maxval = (a > b) ? a : b;
    return maxval;
}
Run Code Online (Sandbox Code Playgroud)

它将转变为

int __max_lv_maxval;
a = (__max_lv_maxval = (x > y) ? x : y), __max_lv_maxval;
Run Code Online (Sandbox Code Playgroud)

显而易见,该功能的性能将下降.

我的问题是编译(如VC2010,gcc)是否优化内联函数并删除局部变量?

Nec*_*lis 6

这本书似乎假设编译器在源代码级别内联,这当然完全取决于编译器.大多数将开始在AST级别内联,其中转换和某些优化可以并且将发生.这一切都假定编译器内联代码.

如果我们查看你的函数,任何体面的编译器都会将它们都转换为相同的IR代码,因为它会在内联之前编译内联函数,因此无论如何都需要临时函数(在IR级别).当IR实际上被内联时,临时将被折叠掉,而是替换为呼叫的分配目的地max.

当我们编译成机器代码时,事情可能会发生更大的变化,不仅可以删除临时值,而且目标很可能是一个寄存器(在这种情况下),它可能也用于源操作数.

底线: 这完全取决于您的编译器,优化级别以及它如何进行变量生动性分析,值传播和折叠.