gpt4 book ai didi

c++ - 我可以合理地期望编译器能够内联什么?

转载 作者:行者123 更新时间:2023-11-30 04:30:40 26 4
gpt4 key购买 nike

是否有任何通用规则可用于评估现代编译器是否会内联函数?额外堆栈框架的相对成本是多少(我知道它非常小,但有什么方法可以对其进行一般量化 - 在一个数量级左右)?

我还特别感兴趣:

  • 编译器可以内联 cpp 中定义的方法吗?
  • 我知道有些编译器甚至在调试时也会进行一些优化(VS 在调试时使用 RVO 而不是 NRVO)- 内联的情况如何?我想它已被禁用,以便我们可以看到用于调试的预期调用堆栈。

我目前正在尝试微优化内存跟踪系统,特别是那些在未启用优化(调试)的情况下也适用的系统。

最佳答案

预测容易,预测难。简单的表达式,例如:

int a = b + (2 * c):
int d = e + (2 * c);

使用最简单的优化进行优化((2 * c)“公共(public)子表达式”只会计算一次。

在 C/C++ 中,声明为内联的方法通常是(尽管不总是)。

更棘手的是循环优化等。例如,

for (int i = 1; i < n; i++) {
a = i + (2 * c);
}

表达式 (2 * c) 通常会在执行“全局优化”的编译器中退出循环,但不会在仅执行“局部优化”的编译器中执行。当然,表达式会变得更加复杂和令人费解。

将上述循环的主体更改为 a = i * (2 * c);,然后您将进入一个略高的全局优化级别,称为“循环归纳”。一个“聪明”的编译器会想出只需将 2 * c (预先计算的)添加到 a 循环中的每次迭代,而不是做(更昂贵的)乘法每次迭代。

这只是表面现象。

但我不知道 Visual Studio 编译器的功能。

关于c++ - 我可以合理地期望编译器能够内联什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8556608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com