操作系统处理的2D(甚至多维)数组存储和访问

时间:2018-11-26 03:43:20

标签: arrays data-structures

根据到目前为止的经验,二维数组和线性一维数组都存储在内存中。现在我的问题是,我已经声明了一个二维数组(5 * 5),对其进行了初始化,现在我想访问索引(3,4)。我将只写arr [3] [4],但OS如何实际访问元素。操作系统将如何得知从第二行,第三行等开始的索引是什么?

1 个答案:

答案 0 :(得分:2)

  1. 操作系统与此无关。就OS而言,该进程正在访问其自身的变量之一。操作系统并不关心进程如何使用自己的内存。 (好的,操作系统可能会收到通知,需要分配内存页面或从缓存中检索内存页面,但这完全不同。)

  2. 您可能是说编译器如何生成代码以访问数组元素。

    • 假设我们说的是C语言程序,声明是

      long arr[5][5];

    • 然后编译器将编译

      arr[i][j]

      插入* (* (arr + i) + j),在机器代码中解析为

      LOAD地址arr进入寄存器

      ADD i 乘以行大小(在我们的示例中,i乘以5倍sizeof(long)

      ADD j 乘以元素大小

      现在寄存器中保存着arr[i][j]的地址。

  3. 对于所问的问题,编译器如何寻址arr[3][4],答案是所有这些计算都是在编译时完成的(因为索引是常量),并且访问与访问任何简单变量。

  4. 多维数组不仅作为单维数组存储。它们确实是 一维数组,至少在诸如C之类的语言中。您的示例arr[5][5]是一个包含5个元素的数组(声明中的第一个5)。数组的每个 都是5个元素的数组(声明中的第二个5)。