Сколько памяти выделится под массив (List) из 8 целых чисел (int) в Dart?

Ответ

В Dart, который используется в Flutter, тип int является 64-битным целым числом. Это значит, что под один int в памяти выделяется 8 байт.

Для списка List<int> из 8 элементов:

  • Под данные: 8 элементов * 8 байт = 64 байта.
  • Служебная информация списка: Сам объект List содержит заголовок (указатель на класс, хэш-код) и поля для длины и ссылки на внутренний массив (_data). Это добавляет примерно 16-24 байта (зависит от платформы и режима выполнения).

Пример и проверка:

void main() {
  // Создаем фиксированный список из 8 нулей
  final list = List<int>.filled(8, 0);
  print('Длина списка: ${list.length}'); // Длина списка: 8
  // Приблизительная оценка: 64 + ~20 = ~84 байта.
}

Итог: Под список из 8 int будет выделено примерно от 80 до 90 байт.

Важные нюансы:

  1. Для типов double или int? (nullable) размер элемента также составляет 8 байт.
  2. Для String или других объектов список хранит ссылки (также 8 байт на 64-битной платформе), а сами объекты строк лежат в отдельной памяти.
  3. Списки в Dart динамически расширяются. При создании через List() или [] выделяется «буфер» с запасом, что увеличивает начальное потребление памяти.

Ответ 18+ 🔞

А, ну это же про память в Dart, ёпта. Сидишь такой, пишешь на Flutter, и вдруг задумался: а сколько же там мои циферки в списке места жрут? Ну, слушай сюда, сейчас разложу по полочкам, без всякой воды.

Вот смотри. В Dart'е, если ты объявляешь int, то это не какая-то мелочь — это полноценное 64-битное целое число. А это, на минуточку, целых 8 байт на одну штуку. Не бит, а байт, чтобы ты понимал масштаб.

Теперь представим, что у тебя список из восьми таких int. Арифметика проще некуда: 8 элементов умножаем на 8 байт. Получается 64 байта чисто под данные. Но это ещё не всё, блядь!

Сам список — это же не просто дырявый носок, куда числа кидаешь. Это объект, у него своя служебная обвязка есть: заголовок, длина, ссылка на внутренний массив... Короче, добавляет эта бюрократия ещё примерно 16-24 байта. Зависит от того, где код бежит, но в среднем так.

Вот тебе наглядный пример, чтоб не быть голословным:

void main() {
  // Делаем список, забитый восемью нулями
  final list = List<int>.filled(8, 0);
  print('Длина списка: ${list.length}'); // Длина списка: 8
  // Прикидываем: 64 (данные) + ~20 (обвязка) = ~84 байта.
}

Итог, блядь: список из восьми int сожрёт у тебя где-то от 80 до 90 байт оперативки. Не овердохуища, конечно, но и не мелочь по карманам шмыгать, если списков тысячи.

А теперь важные нюансы, на которых можно обжечься:

  1. double или int? (этот nullable, с вопросом) — размер такой же, 8 байт за штуку. Никаких скидок за необязательность, ядрёна вошь!
  2. Со String или любыми другими объектами — там история хитрее. Список хранит только ссылки на них (те же 8 байт), а сами объекты болтаются где-то в памяти отдельно. Так что не думай, что строка из 100 символов влезет в 8 байт — нихуя подобного.
  3. И самое главное! Обычные списки, которые ты создаёшь через List() или просто [] — они же динамические, расширяемые. А это значит, что Dart, такой хитрожопый, сразу выделяет под них буфер с запасом, чтобы потом быстро добавлять элементы. Так что начальный аппетит у такого пустого списка может быть больше, чем ты ожидаешь. Вот такой подвох.