Сколько, на самом деле, требуется памяти для переменных?
Например, в языке С есть тип 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 байт.
Отвечая на вопрос: все решает компилятор, зная размер регистра процессора, который будет использовать переменную. Какой регистр будет использоваться решает так же комплятор.
Отвечая на вопрос: все решает компилятор, зная размер регистра процессора, который будет использовать переменную. Какой регистр будет использоваться решает так же комплятор.
ты про исполнимый код, exe-файл?
Эта информация не находится в памяти. Компилятор создает код сразу с учетом всего этого. Точнее, это для локальных (стековых) переменных. Место, где переменная выходит из области видимости - вполне известно на этапе компиляции, соответственно компилятор в этом месте просто добавляет код по уничтожению переменной (вызов деструктора, изменение указателя стека) .
А сколько занимает в памяти - так это фиксировано в самом типе. Любая переменная данного типа занимает одинаковое количество памяти.
А сколько занимает в памяти - так это фиксировано в самом типе. Любая переменная данного типа занимает одинаковое количество памяти.
А процессору фиолетово на данные, с которыми он работает.
Он тупо выполняет программу, которую ему собрал компилятор.
Что означают эти 2 байта, целое там или символ, это для процессора просто данные, требуемые для выполнения конкретной инструкцией.
Если данные будут кривыми, выдастся исключение и программу выкинет.
Он тупо выполняет программу, которую ему собрал компилятор.
Что означают эти 2 байта, целое там или символ, это для процессора просто данные, требуемые для выполнения конкретной инструкцией.
Если данные будут кривыми, выдастся исключение и программу выкинет.
Хм. . интересный вопрос. Никогда об этом не задумывался)
Тоже жду ответ)
Тоже жду ответ)
Похожие вопросы
- Что имеется ввиду под 4 байтами у типа данных int?(С++)
- Есть ли в программировании основные (фундаментальные) типы данных, от которых берут начало другие типы?
- Тип данных в паскале
- Перечислите основные типы данных
- C++. Типы данных. Создание типа данных.
- Что это за тип данных? (Delphi)
- Абстракция и абстрактные типы данных.
- Как проверить тип данных на си?
- Вопрос про типы данных
- C# почему когда создаю тип данных byte - он его автоматически преобразовывает в тип int?