Знаете то чувствие, когда на собеседовании спрашивают про сборщик мусора, а в голове только «ну... он собирает мусор?» 😅 Давайте разберём, как Dart на самом деле управляет памятью — без воды и лишней теории.
Указатели — не адреса, а записки с адресами
В 64-битном мире указатель — это 8 байт. Представьте: объект живет по адресу
0x00A03F50
, а в переменной лежит не сам объект, а «листочек» с этим адресом. Но Dart пошёл дальше — он использует последний бит указателя как тег 🏷️
Адрес объекта (кратен 16): 0101 0000
Dart ставит флаг «это объект»: 0101 0001 → 0x00A03F51
Если последний бит 1 — это ссылка на объект в куче. Если 0 — это Smi (Small Integer) — число, живущее прямо в указателе! Никакого перехода по адресу, никакой нагрузки на GC. Число 7 превращается в
1110
(сдвиг влево на 1), а при чтении — обратно делится на 2. Элегантно? Однозначно ✨
А как же C++ код в движке?
GC любит перемещать объекты для дефрагментации. Dart-код обновит ссылки сам, но нативный C++ не узнает о переезде 💥 Решение — Handles: двойная косвенность. C++ держит не адрес объекта, а адрес «ячейки», куда GC пишет актуальный адрес. Объект переехал — Handle обновился — C++ счастлив 🤝
Практический вывод: создавайте объекты осознанно. Каждый лишний объект — работа для GC. Числа (Smi) — бесплатны. Понимание этих механик — ваш суперпауэр для написания быстрого Flutter-кода ⚡
Полную новость читайте здесь
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #hardworkerFlutter #dartvm #garbagecollection #performance