代码之家  ›  专栏  ›  技术社区  ›  lamas

C(++)与不存储在变量中的值有什么关系?

  •  15
  • lamas  · 技术社区  · 15 年前

    我对C和C++如何处理不存储在变量中的数据有点好奇,例如:

    int IE6_Bugs = 12345;
    int Win_Bugs = 56789;
    

    是的-一切都清楚了。 IE6_Bugs 在它的特定内存地址存储了123456。

    那么……

    if ( IE6_Bugs + Win_Bugs > 10000 )
    {
      // ...
    

    因此,C获取两个变量的值,并将它们相加,以便将结果与右边的int进行比较。

    但是:

    • IE6_Bugs+Win_Bugs 有没有接触过Ram?或者处理器直接通过自己的缓存比较这些值?

    • 或者,在编译过程中,上述if语句是否转换为机器更“可理解”的内容?(也许可以计算 IE6漏洞+赢漏洞 首先,将其存储在某个变量中,…)

    6 回复  |  直到 15 年前
        1
  •  18
  •   Mahmoud Al-Qudsi    15 年前

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

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

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

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

        2
  •  8
  •   Greg Bacon    15 年前

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

    一个被称为“常量折叠”的优化在编译时计算常量表达式的值。在您的特定示例中,智能编译器将认识到您的条件总是正确的,并且避免为测试生成代码,因此值12345、56789和10000可能根本不在为您的程序生成的机器代码中表示。

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

        3
  •  4
  •   Jimmeh    15 年前

    好的编译器会不断地传播和折叠,所以在这个例子中,它会用12345替换ie6_错误,用56789赢得_错误,然后将其转换为69134。然后,它可能还会将69134>10000折叠为“true”,并在编译时完全删除分支。

    至于如果表达式不进行持续的传播或折叠(内存位置或寄存器),它将存储表达式的结果的位置。注册速度会快得多。

        4
  •  4
  •   anon    15 年前

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

        5
  •  2
  •   Billy ONeal IS4    15 年前

    绝对没有办法最终回答这个问题。这里的其他答案对于大多数架构都是精确的,但这不是由C/C++标准所指定的,这是硬件无关的。

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

        6
  •  0
  •   Jive Dadson hmishra2250    15 年前

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

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