awesome-everything EN
↑ Обратно к восхождению

Базовый CS с нуля

Данные в памяти: чтение кода и раскладки

Суть Читай небольшие сниппеты и раскладки в памяти, вычисляй адреса элементов через 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];   // какой адрес читает это?
Викторина

При base address 1000 и 4-байтовом элементе какой адрес читает scores[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];   // адрес?
Викторина

При base address 2000 и 8-байтовом элементе какой адрес читает big[2]?

Сниппет 3 — value-ячейки против reference-ячеек

let nums  = [10, 20, 30];                 // array чисел
let users = [{ name: "A" }, { name: "B" }]; // array объектов
Викторина

Что хранит каждая ячейка nums против каждой ячейки users?

Сниппет 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;   // как это достаётся?
Викторина

При чтении users[1].age какая последовательность верна?

Итог

Любой вопрос о раскладке сводится к тем же двум движениям. Сначала арифметика: адрес элемента — это base + index x element_size — индекс считает элементы, element size превращает его в байты, а длина никогда не появляется. Меняешь element size — тот же индекс попадает в другое место. Затем спроси, что хранит ячейка: малое value лежит в ячейке напрямую, но объект не вмещается, поэтому ячейка хранит reference, и чтение поля — два прыжка: арифметика в contiguous array, затем один проход к объекту.

Продолжить восхождение ↑Данные в памяти: построй модель раскладки памяти
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.