C++表达式评估:"引擎盖下"会发生什么?

Alf*_*ald 5 c++ evaluation expression temporary

我还在学习C++.我试图以一种相当循序渐进的方式理解评估是如何进行的.所以使用这个简单的例子,表达式声明:

int x = 8*5 - 5;

这就是我认为发生的事情.请告诉我离我有多远:

  1. 操作数x,8,5和5被"评估".可能会创建一个临时对象来保存每个值(我对此不太确定).

  2. 8*5评估为40,存储在临时.

  3. 40(临时) - 5评估为35(另一个临时).

  4. 35被复制到x中.

  5. 所有临时对象都按照它们创建的相反顺序销毁(该值被丢弃).

我至少接近正确吗?

小智 0

“谢谢您,先生。嗯。如果所有操作数都是命名对象而不是文字,会发生什么?可以说,它会动态创建临时对象,而不是在编译时创建临时对象吗?”

正如萨姆提到的,你在高水平上走在正确的轨道上。在您的第一个示例中,它将使用 CPU 寄存器来存储临时对象(因为它们不是命名对象),如果它们被命名对象,则取决于编译器上设置的优化标志以及代码的复杂性(如何“优化”) ' 代码将是生成的。你可以看一下反汇编,看看到底发生了什么。例如,如果你这样做

a = 5;
b = 2;
c = a * b;
Run Code Online (Sandbox Code Playgroud)

编译器将尝试生成最优化的代码,并且由于在这种情况下有 2 个在编译时已知的常量,并且您执行乘以 2,因此它将能够采用快捷方式,有时乘法被位运算代替哪个更便宜(乘以 2 与向左移动 1 相同)

命名变量必须存在于某个地方,要么在堆栈上,要么在堆上,CPU 将使用命名对象的地址来传递它们并执行函数。(如果它们足够小,它将适合寄存器并对其进行操作,否则它将开始使用内存,首先是缓存,然后渗出到 RAM)

您可以通过 google 搜索“抽象语法树”来了解如何将可读的 C++ 代码转换为机器代码。

这就是为什么了解 const 正确性、别名和指针与引用非常重要,以确保为编译器提供为您生成最佳代码的最佳机会。(除了用户从中获得的优势之外)