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

标签 c++ compilation

现在我正在阅读Inside The C++ Object Model这本书的第四部分并且有一些问题。

像这样的内联函数:

inline int max(int a, int b)
{
    return (a > b) ? a : b;
}

然后,像下面这样的语句: a = max(x, y);

此语句将转换为 a = (x > y) ? x : y;

但是书上说当像这样向内联函数添加局部变量时:

inline int max(int a, int b)
{
    int maxval = (a > b) ? a : b;
    return maxval;
}

它将转化为

int __max_lv_maxval;
a = (__max_lv_maxval = (x > y) ? x : y), __max_lv_maxval;

很明显,函数的性能会下降。

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

最佳答案

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

如果我们查看您的函数,任何体面的编译器都会将它们都变成相同的 IR 代码,因为它会在内联之前编译内联函数,因此无论如何都需要一个临时文件(在红外线水平)。当 IR 实际上被内联时,临时对象将被折叠起来,取而代之的是调用 max 的分配目标。

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

底线: 这完全取决于您的编译器、优化级别以及它如何进行变量活跃度分析、值传播和折叠。

关于c++ - 编译器是否优化内联函数的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736532/

相关文章:

c++ - 从 long long int 中减去一个 int

c++ - 从函数内部推断函数返回类型

android - 将 Android 应用编译为 iOS

python - 无法在场景中正确定位 QGraphicsRectItem

c++ - 在关联容器中使用 emplace(args&& ...)

c++ - 编译时如何处理 C++ 解决方案源文件?

c++ - 编译时复制构造函数/复制赋值和普通函数调用优化有什么区别吗?

c++ - 为什么要编译? [C++]

java - "Launch Configuration"尝试导出可运行 Jar 时显示空白?

c++ - 为什么不可能构建一个可以确定 C++ 函数是否会更改特定变量的值的编译器?