Как расположен элемент массива без повторения массива?
Говорят, что доступ к элементу массива быстрый на языке программирования, знающем числовой индекс элемента. Я предполагаю, что это потому, что память компьютера похожа на массив с каждым слотом памяти, имеющим числовой адрес. Таким образом, зная адрес памяти, мы можем перейти непосредственно к этому адресу и получить доступ к сохраненному там значению.
Как быстро получить доступ к этой памяти? Это делается на уровне микрокода?
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)))
в основной колонке системы. Существует две системы: основная колонка и основная строка. Посмотрите на эту страницу для наглядности. Эта математика все еще довольно проста для компьютера, хотя здесь она выглядит сложной. Многомерные массивы также могут быть реализованы в виде массива массивов, которые будут немного медленнее и менее эффективны с точки зрения памяти.
Проверка вне границ: при расчете положения элемента не учитываются индексы, превышающие длину массива, что может привести к доступу к ячейкам памяти вне массива. Язык С не мешает этому. Java генерирует исключение OutOfBoundsException, но доступ к массиву становится немного дороже из-за выполняемой проверки. Проверка вне границ зависит от языка, если она реализована