Суть Читай небольшие сниппеты и раскладки в памяти, вычисляй адреса элементов через base + i x element_size и рассуждай, что реально хранит ячейка — value или reference.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min
Раскладка в памяти — это где идеи становятся конкретными. Читай каждый сниппет и его раскладку, считай арифметику адреса вручную и решай, что реально хранит каждая ячейка, прежде чем выбрать ответ.
Цель
Потренируй движение, которое делаешь каждый раз, когда рассуждаешь о данных в памяти: зафиксируй base address и element size, вычисли целевой адрес и определи, хранит ли ячейка value напрямую или reference на нечто в другом месте.
Сниппет 1 — формула адреса
// scores — один contiguous-блок.// base address = 1000, каждый элемент 4 байта.let scores = [90, 80, 70, 60, 50];let x = scores[3]; // какой адрес читает это?
Викторина
Completed
При base address 1000 и 4-байтовом элементе какой адрес читает scores[3] и как он вычисляется?
Heads-up Index считает элементы, а не байты. Сначала надо умножить на element size: 1000 + 3 x 4 = 1012. Прибавление сырого индекса игнорирует, сколько байтов занимает элемент.
Heads-up scores[3] — это элемент 3, на три элемента после base, а не на четыре. 1000 + 3 x 4 = 1012. Index 3 — четвёртый элемент, но его offset 3 x element_size.
Heads-up Формула никогда не использует длину: base + i x element_size трогает только base, индекс и element size. Длина не нужна для адреса элемента 3.
Сниппет 2 — element size меняет offset
// Тот же индекс, другой element size.// big имеет base address 2000, каждый элемент 8 байтов.let big = [1.5, 2.5, 3.5, 4.5];let y = big[2]; // адрес?
Викторина
Completed
При base address 2000 и 8-байтовом элементе какой адрес читает big[2]?
Heads-up Offset — это index x element_size, а не фиксированные 8. При 8-байтовом элементе index 2 — это 2 x 8 = 16 байтов после base: 2000 + 16 = 2016. Element size масштабирует offset.
Heads-up Index считает элементы; надо умножать на element size. 2000 + 2 x 8 = 2016. Прибавление сырого индекса игнорирует, что каждый элемент шириной 8 байтов.
Heads-up Element size — часть формулы. 4-байтовый элемент даёт 2000 + 2 x 4 = 2008; 8-байтовый даёт 2016. Тот же индекс, другой offset.
Сниппет 3 — value-ячейки против reference-ячеек
let nums = [10, 20, 30]; // array чиселlet users = [{ name: "A" }, { name: "B" }]; // array объектов
Викторина
Completed
Что хранит каждая ячейка nums против каждой ячейки users?
Heads-up Объект переменного размера и может расти, поэтому не вмещается в ячейку array фиксированного размера. Ячейки users хранят reference на объекты в другом месте; только nums хранит свои value напрямую.
Heads-up Всё наоборот. Число — это малое value фиксированного размера, оно вмещается в ячейку напрямую. Именно объекты не вмещаются, поэтому users хранит reference на них.
Heads-up Оба array — contiguous-сетки из равных ячеек. Разница только в содержимом: nums хранит value, users хранит reference одного размера. Оба сохраняют единообразную раскладку.
Сниппет 4 — доступ в два прыжка в array объектов
// users имеет base address 1000; каждая reference-ячейка 4 байта.// объект user 0 лежит на 7000, объект 1 на 7100, объект 2 на 7200.let users = [u0, u1, u2];let a = users[1].age; // как это достаётся?
Викторина
Completed
При чтении users[1].age какая последовательность верна?
Heads-up Ячейка на 1004 хранит reference (7100), а не объект. Надо пройти по этому адресу к объекту, прежде чем читать любое поле — это второй прыжок.
Heads-up Ты не знаешь, что объект 1 лежит на 7100, пока не прочитаешь reference из ячейки array. Первый прыжок — арифметика в array, чтобы достать этот адрес.
Heads-up Поле достаётся по key, а не сканированием позиций. После прохода по reference к объекту key age находит поле напрямую.
Итог
Любой вопрос о раскладке сводится к тем же двум движениям. Сначала арифметика: адрес элемента — это base + index x element_size — индекс считает элементы, element size превращает его в байты, а длина никогда не появляется. Меняешь element size — тот же индекс попадает в другое место. Затем спроси, что хранит ячейка: малое value лежит в ячейке напрямую, но объект не вмещается, поэтому ячейка хранит reference, и чтение поля — два прыжка: арифметика в contiguous array, затем один проход к объекту.