阵列通常如何在低水平下工作?

Mat*_*att 4 arrays low-level

他们如何将索引直接映射到值而不必迭代索引?

如果它非常复杂,我可以在哪里阅读更多内容?

Oli*_*rth 5

数组只是一个连续的内存块,从某个已知地址开始.因此,如果起始地址是p,并且您想要访问i-th元素,那么您只需要计算:

p + i * size
Run Code Online (Sandbox Code Playgroud)

其中size在每个元件的尺寸(以字节为单位).

粗略地说,访问任意内存地址需要一段时间.


Kei*_*win 5

本质上,计算机内存可以被描述为一系列寻址槽。要制作一个数组,您需要留出一个连续的块。因此,如果您的阵列中需要 50 个插槽,则需要从内存中留出 50 个插槽。在此示例中,假设您为名为 A 的数组留出 1019 到 1068 的插槽。A 中的插槽 0 是内存中的插槽 1019。A 中的插槽 1 是内存中的插槽 1020。A 中的插槽 2 是内存中的插槽 1021,依此类推。所以,一般来说,要获得数组中的第 n 个插槽,我们只需执行 1019+n。所以我们需要做的就是记住起始槽是什么,并适当地添加进去。

如果我们想确保我们不会在数组末尾之外写入内存,我们可能还想存储 A 的长度并根据它检查我们的 n。还有一种情况是,并非我们希望跟踪的所有值都具有相同的大小,因此我们可能有一个数组,其中数组中的每个项目都占用多个插槽。在这种情况下,如果 s 是每个项目的大小,那么我们需要留出 s 倍数组中项目的数量,当我们获取第 n 个项目时,我们需要在开始添加 s 时间 n 而不仅仅是 n . 但在实践中,这很容易处理。唯一的限制是数组中的每个项目的大小都相同。