Memory 数组缓存是否为本地数组?

Memory 数组缓存是否为本地数组?,memory,Memory,如果一个数组 [1,2,3,4,5,6] 存在于连续的内存块中,是否存在数组数组 [[1,2,3],[4,5,6]] 是否必须具有相同的缓存位置 在数组的情况下,数组本身将具有与元素数组相同的局部性属性,因为这种情况没有什么不同-这里的“元素”是数组。然而,每个子数组的元素在内存中是否与另一个子数组的元素相邻取决于子数组的实现 因为你没有指定语言,我将用C++语法来演示,但是这根本上是语言不可知的,因为它涉及到硬件的各个方面。如果数组的数组与C++代码> STD::vector < /C>

如果一个数组

[1,2,3,4,5,6]
存在于连续的内存块中,是否存在数组数组

[[1,2,3],[4,5,6]]

是否必须具有相同的缓存位置

在数组的情况下,数组本身将具有与元素数组相同的局部性属性,因为这种情况没有什么不同-这里的“元素”是数组。然而,每个子数组的元素在内存中是否与另一个子数组的元素相邻取决于子数组的实现

因为你没有指定语言,我将用C++语法来演示,但是这根本上是语言不可知的,因为它涉及到硬件的各个方面。如果数组的数组与C++代码> STD::vector < /C> >——这是一个灵活的容器容器,可以根据需要增长/收缩,每个<代码>:ST::vector >将在内存中与其他的相邻,但是<>代码>:ST::vector < /COD>不包含元素。相反,它是动态分配数组的包装器,通常包含一些指向底层数据的指针。这意味着每个包装器都是连续的,但元素不一定是连续的。这里有一个例子来证明这一点

但是,考虑数组的数组是<代码> STD::数组< /COD>而不是,它只是一个2个元素的数组,其中每个元素是固定大小的数组,3,<代码> int <代码> s。与对应的

std::vector
相比,A
std::array
是固定大小的C数组的包装器,它不是动态分配的。在本例中,您将获得与
std::vector
案例相同的locality属性-每个
std::array
都与其他的respet相邻,但在这里您还可以获得更多内容。由于
std::array
实际上包含底层数据,而不是指向它的几个指针,因此每个子数组的元素也彼此相邻。这一点也可以看到

从硬件的角度来看,这可以归结为对象在内存中的放置方式。在前一种情况下,每个包装器都是连续的,但数据不是连续的,因为包装器只是保存指向数据的指针。在后一种情况下,每个包装都是连续的,数据也是连续的,因为每个包装实际上都包含数据


如果您指定所指的语言,我可能会帮助您处理具体案例。

非常酷,感谢您的详细回复和链接。我不确定这个问题是否与语言无关,所以我没有包括语言。然而,这个问题的灵感来自于我对numpy矩阵与列表/数组相比如何在内存中布局的兴趣。使用关联的类方法将数组的索引映射到矩阵的行/列,表示矩阵的内存效率是否比表示大型一维数组更高?numpy就是这样表示矩阵的(numpy主要是用C编写的)?而不是将矩阵表示为数组数组,其中数组是行。@SSG很高兴我能提供帮助!关于问题的效率部分,在缓存和预取方面,使用可预测的、线性的访问顺序(在其中接触连续内存)比遍历链表更好。通过查看一些numpy源代码,可以看出,在封面下,矩阵由一个底层的
char*
表示,它指向一个原始存储阵列。从我所看到的,numpy确实使用了您提到的技术,这是一个逻辑上平坦的1D数组,其中每个元素都是通过添加到指针来访问的。