ZakkMalin
@ZakkMalin
Designer

Почему при объявлении переменной, в любом языке программирования, резервируется весь размер памяти отведённый под тип данных?

Почему при объявлении переменной в любом языке программирования резервируется весь размер памяти отведённый под тип данных, а не только тот, который данные внутри в действительности занимают

Как-то всё топорски устроено

Скажем хочу купить SSD, для хранения всего одного файла весом в 50 мб, но в продаже есть только на 64GB и выше, как бы тоже самое

Этому каким-то образом способствуют ограничения наложенные на стек и хип?

UPD: ВСЕМ СПАСИБО ЗА ОТВЕТЫ!!! Я НАШЁЛ РЕШЕНИЕ! БЛАГОДАРЯ ДИССКУССИ С ВАМИ. НИ ОДИН ИЗ ОТВЕТОВ НЕ ПОДОШЁЛ, НО ОТВЕТ НАШЁЛСЯ БЛАГОДАРЯ ПРОЦЕССУ ОБЩЕНИЯ! :D
  • Вопрос задан
  • 14052 просмотра
Пригласить эксперта
Ответы на вопрос 9
Stalker_RED
@Stalker_RED
Пример с SSD некорректный, все равно что требовать от камаза, например, выпустить грузовик с грузоподъемностью 20кг. Производителю нужен рынок сбыта.
Тем не менее, небольшие чипы памяти существуют, только никто на них не пишет, что это "SSD".

Выделение памяти - операция не бесплатная, и кто-то решил, что так будет выгоднее.
https://randomascii.wordpress.com/2014/12/10/hidde...
https://habr.com/ru/post/270009/

Как-то всё топорски устроено
Вы можете написать сви менеджеры памяти,компиляторы и другие сопутствующие штуки. Не исключено, что обретете мировую известность. Но не думайте, что до вас никто не пытался.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если я просто объявил переменную типа short, то сколько памяти надо под неё выделить? А если записал в неё ноль? А если после этого записал в неё 65535? А где хранить количество выделенной для переменной памяти? И как перевыделять память, если она выделяется в стеке?

P.S. А как вы представляете себе массив с доступом по индексу, если каждый элемент массива имеет свой размер?
Ответ написан
Zarom
@Zarom
Мастер на все руки из жопы
Вопрос из разряда "Почему в байте 8 бит?".

Объявление переменной как раз является запросом на выделение памяти. Если вам необходимо выделить меньше памяти - можно использовать тип с меньшим размером - байт, бит. А примером динамически растущих структур памяти может быть какой-нибудь вектор из C++. В чем недостаток - накладные расходы. В случае недоступности непрерывного участка памяти при расширении классического массива, нужно будет скопировать всю структуру в другую область памяти. Гораздо быстрее и экономичнее с точки зрения скорости работы выделить сразу больший шмат памяти, благо её нынче не дефицит на ПК.
Ответ написан
@DDwrt100
Могу ошибаться, но все это выливается из архитектуры работы компьютера.
Память имеет физическую размерность, процессор работает с строго определенными блоками данных.
Для того чтобы сделать плавающую по объему переменную необходимо потратить ресурсы на её контроль.
При миллионах переменных, будет тратиться очень очень много ресурсов на контроль таких изменений.
Ответ написан
@JZorkiy
Память под переменную в C++ (например) выделяется в соответствии с типом данных и конкретного размера для быстродействия работы программ, чтоб компьютер во время выполнения программы не занимался постоянным пересчитыванием и перевыделением памяти для многих тысяч переменных, содержимое и размер которых постоянно меняется в пределах типа.
А к размерам SSD это никакого отношения не имеет.
И какой тогда смысл в типах данных, если память для них будет выделяться строго по размеру содержимого? Именно для этого типы данных и существуют.
Ответ написан
@Kosyachoka
1. А почему вы решили что чтото чегото обязывает или накладывает ограничение? С вашей фантазией все возможно. Сделайте тип из массива битов, сделайте логику которая будет его расширять по надобности, сужать по определенным условиям... Профит.
2. В пример - почему вы живете в жилплощади которая больше чем вы занимаете места? Пусть каждый сделает себе коробочки по росту и ширине, а когда будут поправляться, худеть или детей заводить, то будут перестраивать по потребностям. Понастроенные дома совсем не оптимальны по занимаемому пространству.
Ответ написан
@lorc
Почему при объявлении переменной в любом языке программирования резервируется весь размер памяти отведённый под тип данных, а не только тот, который данные внутри в действительности занимают


Тут сразу два вопроса:

1. Почему вы решили резервируется весь размер?
2. Как определить сколько данные действительно занимают?

По первому пункту - есть динамические типы данных вроде списков, векторов, деревьев и т.д. Они обычно занимают столько места, сколько нужно + накладные расходы.

По второму - вот создал я структуру из целых чисел. Мне нужно где-то еще завести битовую маску для того чтобы знать какие поля уже используются. И при каждом обращении к полю, нужно сначала вычитать маску, рассчитать смещение от начала структуры и только потом прочитать поле. А если я пишу в поле, которое раньше не использовалось, то мне нужно выделить новый кусок памяти, расположить там старые поля и только потом добавить новые. И потом обновить все указатели на эту структуру. Представляете сколько лишней работы для процессора?

То же самое для примитивных типов - вместо фиксированного числа бит я должен отдельно хранить длину числа и потом само число. При попытке записать в переменную бОльшее число, я буду вынужден искать новый кусок памяти. Кстати, на самом деле такая штука реализована, называется BigInt. Но область применения у нее довольно узкая....

Вообще, попытайтесь поставить себя на место разработчика компилятора (или процессора) и прикинуть как бы вы хранили в памяти такие вот данные переменной длины. Как бы вы решали вопросы с увеличением (и уменьшением) размеров и т.д. Попробуйте просто нарисовать на бумажке участок памяти и поиграйте с операциями записи и чтения.

Кстати, на самом деле память не всегда выделяется под переменную. Современные компиляторы достаточно умны для того что бы держать большинство локальных переменных в регистрах, вообще не трогая стек и/или кучу.
Ответ написан
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
ZakkMalin,
ну а что она не может быть динамической, зачем хранить и передавать 2 миллиарда, если скажем внутри переменной простое число 1?
то есть все таки надо объяснять...
Для начала: Есть размерность регистров, которые принимают переменные в размере разрядности регистра, и в целом быстрее и удобнее хранить переменную размером в битность регистра. Все что меньше требует оверхеда по обработке "лишнего" места, все что больше - требует разбиения на несколько регистровых переменных(это очевидно для людей работавших с асмом). В основном типы данных - это компромисс из потери скорости работы и экономии места в памяти.
Далее, к вопросу динамически меняющихся размеров переменной - любая аллокация - дикий оверхед в 3 и более операции, а так как данные в куче идут подряд, без аллокации расширить размер переменной не получится. К этому добавьте фрагментацию кучи, что тоже серьезно добавляет тормозов.
Есть еще куча всякого разного из нюансов, но это основные аргументы.
Ответ написан
Jump
@Jump
Системный администратор со стажем.
Потому что выделение памяти это время и расходы.
Выделил мало - придется выделять дополнительно.

Память расходуется экономнее, но замедляется выполнение программы, расходуется больше процессорного времени, в итоге программа работает медленнее.

В итоге мало выделишь плохо, много выделишь тоже плохо.
Нужна золотая середина.
Но в разных ситуациях она будет разной, поэтому оценивают и выбирают наиболее удачный в плане производительности вариант.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы