数组是否缓存本地数组?

如果是数组

[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?