gpt4 book ai didi

C++ 表达式计算 : What Happens "Under The Hood"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:24 26 4
gpt4 key购买 nike

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

整数 x = 8 * 5 - 5;

这就是我相信发生的事情。请告诉我我离标准还有多远:

  1. 操作数 x、8、5 和 5 被“计算”。可能会创建一个临时对象来保存每个值(对此我不太确定)。

  2. 8 * 5 的计算结果为 40,它存储在一个临时文件中。

  3. 40(临时)- 5 计算为 35(另一个临时)。

  4. 35被复制到x中。

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

我是否至少接近于正确?

最佳答案

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

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

a = 5;
b = 2;
c = a * b;

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

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

您可以在谷歌上搜索“抽象语法树”,了解可读的 C++ 代码如何转换为机器代码。

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

关于C++ 表达式计算 : What Happens "Under The Hood"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39436597/

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