Когда память отделяется под конкретную переменную: во время объявления или во время присваивания этой переменной некоторого значения?
Например есть программа, запрашивающая два числа у пользователя.
Я думал объявить 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 байт!
Но значения не обнуляются, а просто устанавливается ссылка на «кучу» .
Что-то какие-то „сомнительные“ действия ты собираешься производить с переменными.
Обычно делается так: прикидываем диапазон хранимых значений и исходя из него определяем тип переменной.
Другое дело, если ты не знаешь заранее какой тип значения будет получен (целый, вещественный, строка) .
Тогда можно записью:
record T : Byte; { 1 - целое / 2 - вещественное / 3 - строка }
case Byte of
1 : N : Longint;
2 : D : Double;
3 : S : String;
end;
Таким образом, сразу при объявлении такой переменной ей будет выделено 257 байт!
Ты суть трансляции представляешь? Встретилось в тексте определение переменной. Транслятор отводит ей место и помечает у себя в памяти, что вот это место связано с этой переменной. И потом, когда встречается в исходнике эта переменная, в объектнике будет стоять ссылка на нужный адрес. Так работают все трансляторы. Есть языки без обязательного определения переменных. Такие трансляторы обычно двухпроходные. Тогда место переменной отводится при первом проходе. А при втором уже вместо имени используется адрес. Так называемое разыменование.
А можете объяснить, для чего все это?
Когда вы объявляете переменную некоторого типа, компилятор резервирует соответствующий этому типу объем памяти. Поэтому объявляйте два длинных целых и там отлично разместятся и просто целые и короткие.
> было бы можно так сэкономить память
С какой целью? И есть ли гарантия, что юзер введет 2, а не 2000000? Будете проверять ввод? Да, возможно сэкономите на сегменте данных (не уверен) и раздуете сегмент кода (уверен) .
Кстати, для разных переменных память выделяется в разных местах. Для глобальных это сегмент данных программы, для локальных процедур и функций - сегмент стека, а для динамических - куча.
Когда вы объявляете переменную некоторого типа, компилятор резервирует соответствующий этому типу объем памяти. Поэтому объявляйте два длинных целых и там отлично разместятся и просто целые и короткие.
> было бы можно так сэкономить память
С какой целью? И есть ли гарантия, что юзер введет 2, а не 2000000? Будете проверять ввод? Да, возможно сэкономите на сегменте данных (не уверен) и раздуете сегмент кода (уверен) .
Кстати, для разных переменных память выделяется в разных местах. Для глобальных это сегмент данных программы, для локальных процедур и функций - сегмент стека, а для динамических - куча.
Зависит от компилятора, может вообще ничего не выделяться, когда есть свободные регистры.
Похожие вопросы
- Паскаль. Сколько байт занимает переменная типа string[10]? 11? .
- Для чего придумали тип boolean, если переменная этого типа всё равно будет занимать в памяти 1 байт?
- И Снова Паскаль
- Величина переменных.Паскаль.Описание дальше.
- [C++] Зачем динамически выделять память под 1 переменную?
- Строковые переменные (Паскаль).Подскажите пожалуйста
- Чем опасна переменная вещественного типа? (например в Паскале, тип real)
- var k:1..9; напечатать значение переменной k римскими цифрами. в турбо паскаль нужно написать программу
- По какой причине переменная у не меняется? Паскаль
- Напишите 5 задач по турбо Паскалю при решение которых нужна только переменная i . Помогите пожалуйста!