1
18
它将被放置在CPU的寄存器中(假设其中一个可用)。寄存器是一种超快速的超小型RAM,内置于CPU本身,用于存储中间操作的结果。 如果可以确定值始终等于xxx,则智能编译器将替换xxx的值。 请记住,无论它是作为表达式还是作为数字,(x+y对10),它都将 仍然 需要放在一个寄存器中,以便CPU可以访问它并根据它的值执行操作。 有关更多信息,请阅读计算机体系结构。 |
2
8
在一般情况下,代码生成器将这些值直接编码为指令(“立即模式寻址”)或存储在程序的数据段中,以便根据需要加载。 一个被称为“常量折叠”的优化在编译时计算常量表达式的值。在您的特定示例中,智能编译器将认识到您的条件总是正确的,并且避免为测试生成代码,因此值12345、56789和10000可能根本不在为您的程序生成的机器代码中表示。
编译器可能有一个选项来保留为程序生成的中间汇编语言,
例如
,
|
3
4
好的编译器会不断地传播和折叠,所以在这个例子中,它会用12345替换ie6_错误,用56789赢得_错误,然后将其转换为69134。然后,它可能还会将69134>10000折叠为“true”,并在编译时完全删除分支。 至于如果表达式不进行持续的传播或折叠(内存位置或寄存器),它将存储表达式的结果的位置。注册速度会快得多。 |
4
4
它将无名称的临时值放在指定变量所在的位置——通常放在堆栈上。与命名变量一样,编译器可以选择将这些值放入CPU寄存器以加快速度。如果您真的对此感兴趣,您应该看看编译器生成的汇编程序输出。 |
5
2
绝对没有办法最终回答这个问题。这里的其他答案对于大多数架构都是精确的,但这不是由C/C++标准所指定的,这是硬件无关的。 评估顺序由标准定义。事情最终如何在内存中处理并不是。 |
6
0
判断的方法是检查生成的汇编程序代码,或者在调试器中单步执行。不同的编译器可能以不同的方式执行。它还可能取决于编译器选项,如“调试”。 如果声明前面加了“const”,那么这里关于常量折叠和消除“if”测试的注释将适用。 |
Community wiki · 如何调试Python内存故障? 1 年前 |
tuskiomi · 如何为参考提供明确的锈蚀寿命? 2 年前 |
cobb208 · Malloc正在为释放指针引发错误 2 年前 |
mo FEAR · C++ STL映射是否在创建后移动了一个值的位置? 2 年前 |
Pooyanoss · 覆盖类的堆栈分配实例 2 年前 |
TheKing · 为什么数组的地址可以有负值? 2 年前 |
Http2inc · 如何从内存中解析这些二进制数据? 2 年前 |
tifrel · 如何检查已编译类型的表示形式? 2 年前 |
Gabriele · 释放GSL矩阵的正确方法是什么? 6 年前 |
Makogan · 3D纹理大小影响程序输出,不会引发错误 6 年前 |