C 优化:访问不同内存区域中的指针

C 优化:访问不同内存区域中的指针,c,pointers,memory,optimization,memory-management,C,Pointers,Memory,Optimization,Memory Management,假设存在以下情况: int** data = calloc(3, sizeof(int* )); int* dynamicInt = calloc(1, sizeof(int)); int automaticInt = 0; int stackint[1] = {0}; data[0] = dynamicInt; data[1] = &automaticInt; data[2] = stackint; 然后,您将使用数据[i] 在我看来,从一个堆跳到另一个堆栈甚至比从一个堆跳到堆中

假设存在以下情况:

int** data = calloc(3, sizeof(int* ));

int* dynamicInt = calloc(1, sizeof(int));
int automaticInt = 0;
int stackint[1] = {0};

data[0] = dynamicInt;
data[1] = &automaticInt;
data[2] = stackint;
然后,您将使用数据[i]

在我看来,从一个堆跳到另一个堆栈甚至比从一个堆跳到堆中的另一个地址还要慢


分配这些指针的最快方法是什么?
真正有用的是,如果有人列举可能的变化(例如:堆栈:6(最快)、堆堆5、自动4、堆堆3等等)

我的意思是,它们都在RAM中,对吗?访问堆栈与访问堆的性能imho没有显著差异。性能受到影响的地方是您的空间缓存位置,因为您可能会在整个内存中跳转并获取缓存未命中。如果您关心性能并且必须使用这样的方案,那么通过按指针的值(即地址)对指针进行排序,您可能会从中受益。但是,如果您的指针没有太大变化,您仍然可能从缓存中的时间局部性中获益。不确定这是否有帮助,但这是我的两分钱。

即使引用的地址被交换,也没有区别,因为您不访问它。

如果您有一台普通电脑,内存就是内存。没有区别。如果这真的很重要,大多数现代汇编程序都有一个预取操作,在需要地址之前预加载地址。这可以减轻或删除缓存的第一个负载。在这个最简单的示例中,性能肯定没有什么意义,但如果在迭代整个列表(DLL经常发生)时,在包含许多元素的双链接列表中实现,我敢肯定,性能差异较小,因此,通过1232和181381238这样的地址,有时在上面有l2的旧处理器上,性能差异较小:)@JuanPabloJuliosEstebaFiores唯一的性能差异将与缓存未命中有关。但是,当您使用动态分配的数据时,无法保证多个分配将位于同一缓存线中。除非您在不同的内存区域中有数千个项目,并且您经常访问它们,否则影响将可以忽略不计。