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

Про типы данных.

Сколько, на самом деле, требуется памяти для переменных?
Например, в языке С есть тип short int. Переменная этого типа занимает в памяти 2 байта.

А вот как узнать (процессору) , какого типа объект находится в этой переменной, в какой области видимости находится переменная? Значит, эта информация тоже должна хранится в памяти. Какое количество памяти в итоге занимает переменная?

Надеюсь, понятно объяснил. .
Хороший вопрос. Все зависит от размера используемых регистров и то, как организует это компилятор. Например, имеем цикл: for(byte b = 0; b < 4; b++). Переменная типа byte занимает 1 байт в памяти. Компилятор может оставить byte и использовать для подсчета счетчика цикла маленький регистр, к примеру al. А может и не использовать маленький регистр, а использовать к примеру ax (2 байта) . Тогда в памяти предварительно компилятор "выровняет" переменную, дописав еще 1 нулевой байт, чтобы при загрузке переменной в регистр не попал туда "мусор", т. е. часть другой переменной, которая по соседству лежит. А еще компилятор может использовать полноценные 32 битные (4 байт) регистры, если приложение конечно 32 битное, так же выравнивая переменные в памяти. А если приложение вобще 64 битное, то переменная типа boolean, она же bool, которая имеет два значения (истина/ложь) и кодируется всего 1 битом, может занимать в памяти аж 8 байт! А теперь самое главное. Как вы знаете, исходный код преобразуется (транслируется/интерпритируется) компилятором в машинный код. Машинный код это не что иное как команды процессора. Так вот, кодманда mov ax, [0100h]; загрузит из памяти по адресу 100 два байта, потому что грузит она в именно в регистр ax, который имеет размер 2 байта. Компилятор знает об этом, поэтому и выравнивает переменные под размер регистра, который их будет использовать. Соответственно команда mov eax, [0100h]; загрузит 4 байта, а команда mov rax, [0100h]; загрузит соответственно 8 байт.
Отвечая на вопрос: все решает компилятор, зная размер регистра процессора, который будет использовать переменную. Какой регистр будет использоваться решает так же комплятор.
Юрий Явир
Юрий Явир
18 381
Лучший ответ
ты про исполнимый код, exe-файл?
Эта информация не находится в памяти. Компилятор создает код сразу с учетом всего этого. Точнее, это для локальных (стековых) переменных. Место, где переменная выходит из области видимости - вполне известно на этапе компиляции, соответственно компилятор в этом месте просто добавляет код по уничтожению переменной (вызов деструктора, изменение указателя стека) .
А сколько занимает в памяти - так это фиксировано в самом типе. Любая переменная данного типа занимает одинаковое количество памяти.
А процессору фиолетово на данные, с которыми он работает.
Он тупо выполняет программу, которую ему собрал компилятор.
Что означают эти 2 байта, целое там или символ, это для процессора просто данные, требуемые для выполнения конкретной инструкцией.
Если данные будут кривыми, выдастся исключение и программу выкинет.
Alexey Nemolochnov
Alexey Nemolochnov
11 112
Хм. . интересный вопрос. Никогда об этом не задумывался)
Тоже жду ответ)