【发布时间】:2016-02-15 12:35:20
【问题描述】:
如果执行以下代码:
int *array = new int[1000];
for (int i = 0; i < 1000; i++)
array[i] = i * 2;
CPU 将数组存储在缓存中。但是,如果执行以下代码:
int *array = new int[1000];
for (int i = 1000-1; i >= 0; i--)
array[i] = i * 2;
我想知道 CPU 是否也可以缓存数组,或者它是否只假设它存在于“向前”方向。
【问题讨论】:
-
你不应该在意。性能例外,CPU 缓存对程序是透明的。
-
缓存使用第 32 行或第 64 行等...(取决于硬件)字节。并且可能具有内存粒度,因此首先访问任何字节将完整(n 字节)内存块加载到缓存行中
-
如果你把
int array[1000];放在堆栈上,这是内存的一部分,被重复使用了很多次,所以它很可能在缓存中。如果您担心缓存不使用“新”,它通常比缓存未命中要慢得多。 -
@MarianSpanik 我完全清楚这一点。我只是将其作为可能尚未缓存的内存的示例。
-
@MarianSpanik 只是想补充一点,
new[]有一次 libc/您的操作系统试图为您提供可映射内存的惩罚;除此之外,从 CPU 的角度来看,堆与堆栈并没有什么特别之处;事实上,没有真正的理由假设new[]在堆栈上分配;通常是这样,但是编译器可能会完全检测到它将是一个 1000 个整数数组并将其放在堆上。请参阅@lightningracesinorbit 最喜欢的东西。在没有 MMU 的机器上,堆和栈的概念甚至可能是无效的。