代码之家  ›  专栏  ›  技术社区  ›  amit_vickey

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

  •  0
  • amit_vickey  · 技术社区  · 5 年前

    据我所知,二维数组和线性一维数组一样存储在内存中。现在我的问题是,假设我已经声明了一个二维数组(5*5),初始化了它,现在我想访问索引(3,4)。我将简单地编写arr[3][4],但是操作系统访问元素的实际方式。操作系统如何从第2行、第3行等开始的索引中了解这一点?

    1 回复  |  直到 5 年前
        1
  •  2
  •   AlexP    5 年前
    1. 操作系统与此无关。就操作系统而言,进程正在访问它自己的变量之一;操作系统不关心进程如何处理自己的内存。(好的,操作系统可能会收到通知,需要从缓存中分配或检索内存页,但这是完全不同的。)

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

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

        long arr[5][5];

      • 然后编译器将编译

        arr[i][j]

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

        LOAD 地址 arr 登记

        ADD 乘以一行的大小(在我们的例子中, i 次数5次 sizeof(long) )

        添加 J 乘以元素的大小

        现在登记册上有 ARR[I] .

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

    4. 多维数组不仅仅是 存储 作为一维数组。他们真的 一维数组,至少在C等语言中是如此。 arr[5][5] 是一个包含5个元素的数组(第一个 5 在声明中)。各 要素 数组中有一个由5个元素组成的数组(第二个 在声明中)。