C(+;+;)如何处理非';t存储在变量中? 我有点好奇C和C++如何处理不存储在变量中的数据,例如: int IE6_Bugs = 12345; int Win_Bugs = 56789;

C(+;+;)如何处理非';t存储在变量中? 我有点好奇C和C++如何处理不存储在变量中的数据,例如: int IE6_Bugs = 12345; int Win_Bugs = 56789;,c++,c,memory,compilation,C++,C,Memory,Compilation,是的,一切都清楚了IE6_Bugs将123456存储在其特定的内存地址 那么 if ( IE6_Bugs + Win_Bugs > 10000 ) { // ... 因此C获取两个变量的值并将它们相加,以便将结果与右边的int进行比较 但是: IE6\u bug+Win\u bug是否曾经到达RAM?或者处理器是否通过自己的缓存直接比较这些值 或者,在编译过程中,上面的if语句是否转换为机器更“可理解”的语句?(可能首先计算IE6_bug+Win_bug,并将其存储在某个变量中,…

是的,一切都清楚了
IE6_Bugs
将123456存储在其特定的内存地址

那么

if ( IE6_Bugs + Win_Bugs > 10000 )
{
  // ...
因此C获取两个变量的值并将它们相加,以便将结果与右边的int进行比较

但是:

  • IE6\u bug+Win\u bug
    是否曾经到达RAM?或者处理器是否通过自己的缓存直接比较这些值

  • 或者,在编译过程中,上面的if语句是否转换为机器更“可理解”的语句?(可能首先计算IE6_bug+Win_bug,并将其存储在某个变量中,…)


它将被放置在CPU的寄存器中(假设有可用的寄存器)。寄存器是一种超高速超小型RAM,内置于CPU本身,用于存储中间操作的结果

如果可以确定该值始终等于xxx,则智能编译器将替换xxx的值

请记住,无论它是表达式还是数字,(x+y vs 10),它仍然需要放在寄存器中,以便CPU可以访问它并根据其值执行操作


有关更多信息,请阅读计算机体系结构。

在一般情况下,代码生成器直接在指令中对这些值进行编码(“即时模式寻址”),或根据需要将其存储在要加载的程序数据段中

称为“常量折叠”的优化在编译时计算常量表达式的值。在您的特定示例中,智能编译器将识别您的条件始终为真,并避免为测试生成代码,因此在为您的程序生成的机器代码中可能根本无法表示值12345、56789和10000


您的编译器可能有一个选项来保留为您的程序生成的中间汇编语言,例如,
g++-S
。了解一点处理器的体系结构和汇编语言,学习如何理解甚至从输出中做出有用的推断。

它将无名的临时值放在它放置命名变量的任何位置,通常放在堆栈上。与命名变量一样,编译器可以选择将值放入CPU寄存器中以加快速度。如果您真的对此感兴趣,您应该看看编译器生成的汇编程序输出

好的,一个好的编译器会进行不断的传播和折叠,所以在那个例子中,它会用12345替换IE6_bug,用56789替换Win_bug,然后将其转换为69134。然后,它可能还会将69134>10000折叠为“true”,并在编译时完全删除该分支


至于如果表达式没有进行常量传播或折叠,它将在哪里存储表达式的结果,可以是内存位置,也可以是寄存器。注册会快得多。

绝对没有办法最终回答这个问题。这里的其他答案对于大多数体系结构来说都是准确的,但是C/C++标准没有规定这一点,因为C/C++标准与硬件无关


评估顺序由标准规定。事情最终如何在内存中处理并不重要

判断的方法是检查生成的汇编代码,或在调试器中逐步执行它。不同的编译器可以用不同的方式来实现。它还可能取决于编译器选项,例如“调试”


如果声明的前缀是“const”,那么这里关于常数折叠和消除“if”测试的注释将适用。

那么如果它不适合寄存器呢?这取决于CPU架构。有些CPU只能读/写寄存器,不能访问内存和堆栈。在这种情况下,其他内容将从寄存器转移到内存中,并取而代之。:-)将值从寄存器移到内存中以便其他内容可以放入寄存器的过程称为“溢出”。对大多数现代体系结构来说都是如此——但请记住,标准本身并没有规定这一点。int your_Bug=假设int_MAX大于32768。那么Win_Bug超过int_MAX-问题出在哪里正如您可能已经看到的,我选择123456789作为示例数字。