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