Другие языки программирования и технологии

Снова Паскаль) ) Переменные и занимаемая ими память

Когда память отделяется под конкретную переменную: во время объявления или во время присваивания этой переменной некоторого значения?

Например есть программа, запрашивающая два числа у пользователя.
Я думал объявить 6 переменных: 2 - shortint, 2 - integer и 2 - longint. Затем, после ввода чисел, в зависимости от их величины (кстати, как ее определить до записи в переменную я не знаю, вообщем неважно)) ) записывать их в более подходящие переменные) )

Пример не совсем подходящий, но вообщем суть вопроса - когда выделяется память, при объявлении или при присваивании? Спасибо за ответы)
При объявлении…
Но значения не обнуляются, а просто устанавливается ссылка на «кучу» .

Что-то какие-то „сомнительные“ действия ты собираешься производить с переменными.
Обычно делается так: прикидываем диапазон хранимых значений и исходя из него определяем тип переменной.

Другое дело, если ты не знаешь заранее какой тип значения будет получен (целый, вещественный, строка) .
Тогда можно записью:

record T : Byte; { 1 - целое / 2 - вещественное / 3 - строка }
case Byte of
1 : N : Longint;
2 : D : Double;
3 : S : String;
end;

Таким образом, сразу при объявлении такой переменной ей будет выделено 257 байт!
Ivan
Ivan
87 918
Лучший ответ
Ты суть трансляции представляешь? Встретилось в тексте определение переменной. Транслятор отводит ей место и помечает у себя в памяти, что вот это место связано с этой переменной. И потом, когда встречается в исходнике эта переменная, в объектнике будет стоять ссылка на нужный адрес. Так работают все трансляторы. Есть языки без обязательного определения переменных. Такие трансляторы обычно двухпроходные. Тогда место переменной отводится при первом проходе. А при втором уже вместо имени используется адрес. Так называемое разыменование.
А можете объяснить, для чего все это?

Когда вы объявляете переменную некоторого типа, компилятор резервирует соответствующий этому типу объем памяти. Поэтому объявляйте два длинных целых и там отлично разместятся и просто целые и короткие.

> было бы можно так сэкономить память

С какой целью? И есть ли гарантия, что юзер введет 2, а не 2000000? Будете проверять ввод? Да, возможно сэкономите на сегменте данных (не уверен) и раздуете сегмент кода (уверен) .

Кстати, для разных переменных память выделяется в разных местах. Для глобальных это сегмент данных программы, для локальных процедур и функций - сегмент стека, а для динамических - куча.
Зависит от компилятора, может вообще ничего не выделяться, когда есть свободные регистры.