C(++)对未存储在变量中的值有什么作用?

lam*_*mas 15 c c++ memory compilation

我对C和C++如何处理未存储在变量中的数据感到好奇,例如:

int IE6_Bugs = 12345;
int Win_Bugs = 56789;
Run Code Online (Sandbox Code Playgroud)

是的 - 一切都很清楚.IE6_Bugs将123456存储在其特定的内存地址中.

那怎么样..

if ( IE6_Bugs + Win_Bugs > 10000 )
{
  // ...
Run Code Online (Sandbox Code Playgroud)

因此,C抓取两个变量的值并添加它们,以便将结果与右侧的int进行比较.

但:

  • IE6_Bugs+Win_Bugs没有达到内存?或者处理器是否通过自己的缓存直接比较值?

  • 或者,在编译过程中,上面的if语句转换为机器更"可理解"的东西?(也许IE6_Bugs+Win_Bugs首先计算并将其存储在某个变量中,......)

Mah*_*dsi 18

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

如果可以确定该值始终等于xxx,那么智能编译器将在其位置替换xxx的值.

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

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


Gre*_*con 8

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

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

你的编译器可能有一个选项,以保护您的程序,生成的中间汇编语言例如,g++ -S.了解一下处理器的体系结构和汇编语言,以便从这个输出中学习理解甚至有用的推论.