【问题标题】:How is array element located without array iterating?数组元素如何在没有数组迭代的情况下定位?
【发布时间】:2015-04-24 18:15:51
【问题描述】:

据说在知道元素的数字索引的编程语言中访问数组元素很快。我认为这是因为计算机内存有点像一个数组,每个内存插槽都有一个数字地址。因此,知道内存地址后,我们可以直接访问该地址并访问存储在那里的值。

如何快速访问该内存位置?这是在微码级别完成的吗?

【问题讨论】:

    标签: memory microcoding


    【解决方案1】:

    局部变量实际上引用了数组中第一个元素的内存位置。数组中的元素具有固定大小(例如整数每个 4 字节)并按顺序存储在连续的内存块中。对于一维数组,元素的内存位置的计算是memory location of first element + (size in bits of single element * index of element)。请注意,计算中使用的索引是从零开始的,这就是为什么大多数语言对数组使用从零开始的索引。数组的元素实际上可能是对对象的引用以保持元素大小固定,而不是对象本身可能具有可变大小。

    多维数组的额外说明:多维数组中的元素位置可以使用列主系统中的location of element [0][0] + (size of single element * (index for 1st dimension + (index for 2nd dimension * length of 1st dimension) + ... + (index for nth dimension * length of (n-1)th dimension * ... * length of 1st dimension)))计算。有两个系统,列专业和行专业。 Look at this page for a visualization 这个数学对于计算机来说仍然相当简单,尽管它在这里看起来很复杂。多维数组也可以实现为数组的数组,这会稍微慢一些并且内存效率较低。

    越界检查:元素位置的计算没有考虑索引大于数组的长度,这可能导致访问数组之外​​的内存位置。 C 语言不会阻止这一点。 Java 将抛出 OutOfBoundsException,但由于正在执行检查,访问该数组的成本会稍微高一些。越界检查是特定于语言的(如果已实现)

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 2017-05-07
      • 2021-12-05
      • 1970-01-01
      • 2017-03-25
      • 2016-07-12
      • 2020-02-26
      • 2019-02-21
      • 1970-01-01
      相关资源
      最近更新 更多