Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 随机访问连续数组的缓存友好性_C++_Cpu Cache - Fatal编程技术网

C++ 随机访问连续数组的缓存友好性

C++ 随机访问连续数组的缓存友好性,c++,cpu-cache,C++,Cpu Cache,因此,我正在专门为类似ECS的应用程序编写一种自定义脚本语言,而ECS的全部目的是最大限度地减少缓存未命中,因此我想我也可以将其应用于脚本语言。目前,我的解释器使用一个虚拟堆栈(std::vector)来存储它的所有变量。我想知道我的解释器使用连续内存的内存是否会使它对cpu缓存更友好。由于内存是半随机访问的(虽然大部分是靠得很近的),我猜它的好处不会像我按顺序和可预测的方式读取它们那样好。您对堆栈溢出有何看法?连续内存很好,因为内存子系统的许多部分都受益于引用的局部性。但各个部分的工作规模各不

因此,我正在专门为类似ECS的应用程序编写一种自定义脚本语言,而ECS的全部目的是最大限度地减少缓存未命中,因此我想我也可以将其应用于脚本语言。目前,我的解释器使用一个虚拟堆栈(
std::vector
)来存储它的所有变量。我想知道我的解释器使用连续内存的内存是否会使它对cpu缓存更友好。由于内存是半随机访问的(虽然大部分是靠得很近的),我猜它的好处不会像我按顺序和可预测的方式读取它们那样好。您对堆栈溢出有何看法?

连续内存很好,因为内存子系统的许多部分都受益于引用的局部性。但各个部分的工作规模各不相同。通常CPU缓存线小于页面大小,例如64字节比4096字节。向量可能会跨越多条缓存线,因此该比例的连续性并不重要,但它会从页面大小的连续性中获益。

就像本机asm中的调用堆栈一样,当前使用的堆栈末端在缓存中会保持热状态,因此,主要在几个64字节缓存线内的随机访问完全可以。是的,比使用
new
为每个变量获得可能分散的空间要好得多。“我想我也可以将其应用到脚本语言中。”嗯。。。为什么?脚本语言将比不使用脚本语言慢。通过使用它,您愿意牺牲性能来获得一些好处(易于修改、用户友好、快速原型、现场代码修改等)。虽然脚本语言的性能不应该被忽视,但也不应该为此付出巨大的努力。没有经过认真的分析,您的应用程序的性能需要它。“ECS的全部目的是最大限度地减少缓存未命中”不,不是。ECS的发明是为了避免胖接口和使用OOP设计实体类的其他缺点。可以使用ECS来改善数据局部性是一个有用的好处,但这根本不是问题的“关键”。定义“缓存”吗?这里涉及到几个问题。定义“友好”?这是主观的。@tadman:它被标记为[cpu缓存],所以我认为可以安全地假设我们讨论的是cpu通过其缓存层次结构访问主内存。提到数据变量,我还假设它询问的是数据访问,而不是已编译机器代码的缓存(L1i缓存/uop缓存)。