Хранение и доступ к двумерному (или даже многомерному) массиву, управляемый ОС - PullRequest
0 голосов
/ 26 ноября 2018

Из того, что я узнал, двумерный массив также хранится в памяти как линейный одномерный массив.Теперь мой вопрос, скажем, я объявил 2D-массив (5 * 5), инициализировал его, и теперь я хочу получить доступ к индексу (3, 4).Я просто напишу arr [3] [4], но как на самом деле ОС получает доступ к элементу.Как ОС узнает, с какого индекса начинается 2-я строка, 3-я строка и т. Д.?

1 Ответ

0 голосов
/ 26 ноября 2018
  1. ОС не имеет к этому никакого отношения.Что касается ОС, то процесс обращается к одной из своих переменных;ОС не волнует, что процессы делают с собственной памятью.(ОК, ОС может получить уведомление о том, что страница памяти должна быть выделена или извлечена из кэша, но это нечто совсем другое.)

  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], ответ таков: все эти вычисления выполняются во время компиляции (потому что индексы являются константами), иss так же эффективен, как и доступ к любой простой переменной.

  4. Многомерные массивы не только хранятся как одномерные массивы.Они действительно являются одномерными массивами, по крайней мере, в таких языках, как C. Ваш пример arr[5][5] - это массив из 5 элементов (первый 5 в объявлении).Каждый элемент массива является массивом из 5 элементов (второй 5 в объявлении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...