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

时间:2011-12-11 02:12:46

标签: arrays low-level

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

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

3 个答案:

答案 0 :(得分:5)

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

p + i * size

其中size是每个元素的大小(以字节为单位)。

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

答案 1 :(得分:4)

基本上,计算机内存可以描述为一系列寻址的插槽。要创建一个数组,你可以预留一个连续的数组。因此,如果阵列中需要50个插槽,则可以从内存中留出50个插槽。在这个例子中,假设您将1019到1068之间的插槽留作一个名为A的阵列.A中的插槽0是内存中的插槽1019。 A中的插槽1是内存中的插槽1020。 A中的插槽2是存储器中的插槽1021,依此类推。所以,一般来说,要获得数组中的第n个插槽,我们只需要1019 + n。所以我们需要做的就是记住起始槽是什么并适当地添加它。

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

答案 2 :(得分:1)

维基百科很好地解释了这一点:

http://en.wikipedia.org/wiki/Array_data_structure

基本上,选择了内存基础。然后将索引添加到基础。像这样:

if base = 2000 and the size of each element is 5 bytes, then:
array[5] is at 2000 + 5*5.
array[i] is at 2000 + 5*i.

二维数组乘以这种效果,如下所示:

base = 2000, size-of-each = 5 bytes
array[i][j] is at 2000 + 5*i*j

如果每个索引的大小不同,则需要进行更多计算:

for each index
  slot-in-memory += size-of-element-at-index

因此,在这种情况下,几乎不可能在没有迭代的情况下直接映射。