数组是否缓存本地数组?
如果是数组
[1,2,3,4,5,6]
存在于连续的内存块中,执行一组数组
[[1,2,3],[4,5,6]]
必须具有相同的缓存局部性?
在数组数组的情况下,数组本身将具有与数组元素相同的局部性属性,因为这种情况没有什么不同 - 这里的“元素”是数组。 但是,每个子阵列的元素是否在内存中与另一个子阵列的元素是连续的,取决于子阵列的实现。
由于您没有指定语言,我将使用C ++语法进行演示,但这基本上是语言不可知的,因为它涉及硬件的各个方面。 如果你的数组的数组等价于C ++的std::vector<std::vector<int>>
- 这是一个可以根据需要增长/缩小的容器的灵活容器,每个std::vector
将连续内存相对于其他,但一个std::vector
不直接包含元素。 相反,它是一个动态分配数组的包装器,通常包含一些指向底层数据的指针。 这意味着每个包装将是连续的,但元素不一定会是。 这里有一个演示这个的现场演示。
然而,考虑一下你的数组是一个std::array<std::array<int,3>,2>
而不是 - 它只是一个2个元素的数组,其中每个元素都是一个数组固定大小,3, int
s。 std::array
是一个固定大小的C数组,它不是动态分配的包装,与std::vector
相反。 在这种情况下,您可以获得与std::vector
情况相同的locality属性 - 每个std::array
都与respet相邻,但在这里您还可以获得更多内容。 由于std::array
实际上包含底层数据而不仅仅是指向它的几个指针,因此每个子数组的元素也相对于彼此是连续的。 这也可以在这里看到。
从硬件角度来看,这只是您的物体如何放置在记忆中。 在前一种情况下,每个包装都是连续的,但数据不是,因为包装只是指向数据的指针。 在后一种情况下,每个包装都是连续的,数据也是如此,因为每个包装实际上都包含数据。
也许如果你指定了你指的是哪种语言,我可以帮你处理你的具体案例。
链接地址: http://www.djcxy.com/p/36363.html上一篇: Is an array of arrays cache local?
下一篇: How to access array of flexible arrays in cache friendly manner?