2012-02-26 41 views
0

我最近被朋友问过这个问题。 在C程序中,如果我申报的整数int x = 3. x会缓存吗?

int x = 3; 

然后将其提取到缓存?我的意见: 是的。由于处理器将在内存中分配sizeof(int)的空间量。然后写3到该内存位置,它将在其寄存器中获得x,然后向其中添加3。因此,x存储在CPU寄存器中(这是我认为它的工作原理),它也将被提取到缓存中。 而如果我们只声明整数并且不初始化它。例如,

int x; 

那么CPU只是分配内存,并且不写入内存的任何所以在这种情况下x不会在高速缓存中。 这可以概括为什么时候在缓存中获取变量。 让我知道我的想法是否正确。 谢谢

+7

取决于它如何进行优化,它甚至可能永远不会获得内存位置。 – Mysticial 2012-02-26 01:22:49

回答

4

有没有这个确定的答案....但是更有可能。它甚至有很好的机会也会被放入注册表中。如果可以的话,它会避免记忆,只是把它保存在注册表中!

+0

在什么情况下,如果它没有分配内存,它将不会在缓存中存在? – 2012-02-26 01:32:46

3

如果根本没有优化,那么很有可能3永远不会成为一个注册表。相反,编译器将认识到x的值为3,并且将用3代替x的下一次使用,可能具有例如不首先将该值置于寄存器中的加成立即指令。

或者编译器可能将x优化到一个寄存器中,因此x的值永远不会存储在内存中,因此永远不会通过缓存。

而一些处理器具有所谓的“通过存储”缓存,这意味着如果x被分配了存储位置,则该值可以被放置到该位置而不必首先/同时被放置在存储缓存中。

所以我们可以肯定地说价值3可能会出现在缓存中的某处。有时。

0

如果x被分配在堆栈上,而不是寄存器中或者完全被优化掉,那么它肯定会在缓存中。堆栈几乎总是在缓存中,因为堆栈总是被使用。

1

除了依赖于实现,还取决于声明的写入位置。如果它是全局变量,那么3可能只是存储在可执行文件的数据段中,以便在程序开始运行时映射到进程的地址空间。在这种情况下,分配不会在运行时“发生”。

1

首先,CPU不会为您的整数变量分配内存,至少不会自行分配内存。内存分配是编译器和操作系统的组合任务。编译器为CPU或OS生成代码,以便在堆栈或堆中分配内存。然后该代码执行并保留内存。

根据您的代码,编译器优化和操作的各种高速缓存的存在对可变多种可能的命运:

  1. 它不会到缓存中,因为在所有没有缓存或它的禁用
  2. 它没有进入缓存,因为没有代码使用这个变量或者它紧邻的任何数据,所以没有机会将这个变量吸入缓存中
  3. 它可以进入指令缓存而不是数据缓存如果编译器发现这个变量是一个常量并且可以直接编码d在指令(例如:int x=3; y+=x;这里,编译器可以简单地生成代码y+=3和3可以是一个movadd指令的立即操作数)
  4. 类似于编译器上面可以找出如何生成优化的代码,而无需(例如:int x=3; while(x--) printf("*");这里编译器可能会产生3个调用printf("*")或甚至一个调用printf("***")
  5. 它会暂时进入缓存并在使用后被挤出通过其他数据缓存