На обычном современном компьютере вся память является адресной. То есть каждый размер места хранения в байтах в ОЗУ имеет уникальный номер, присвоенный ему. Если вы хотите сохранить значение в один байт, такое как bool
(хотя bool
с не требуется быть один байт в C++, они просто обычно), это занимает единое место хранения, скажем, расположение 42.
Если вы хотите сохранить что-то большее, чем один байт, скажите int
, то это займет несколько последовательных мест хранения. Например, если ваш тип int
имеет длину 16 бит (2 байта), то половина его будет сохранена в местоположении 42, а другая половина - в местоположении 43. Это обобщает на более крупные типы. Скажем, у вас есть 64-битный (8-байтовый) long long int
. Значение этого типа может храниться в разных местоположениях 42, 43, 44, 45, 46, 47, 48 и 49.
Есть еще несколько дополнительных соображений, называемых «выравнивание», которые должны уважать некоторые виды процессоров , Например, у процессора может быть правило, что двухбайтовое значение должно начинаться с четного адреса или четырехзначное значение должно начинаться с адреса, который делится на 4. Ваш компилятор позаботится о деталях этого для тебя.
Компилятор также знает, как долго каждый тип, поэтому, когда он генерирует машинный код для вашей программы, он будет знать, по какому адресу начинается хранилище для каждой переменной, и он будет знать, сколько последовательных байтов хранится в переменной in.
«Регистры», с другой стороны, существуют в процессоре, а не в ОЗУ, и обычно являются фиксированным размером. Одно использование регистров процессора - сохранение значения, полученного из ОЗУ. Например, если ваш процессор имеет 32-разрядные (4 байтовые) регистры, то значение bool
, загруженное из ОЗУ, по-прежнему будет потреблять весь 4-байтовый регистр, хотя он потреблял только один байт, когда он был в ОЗУ.
Для людей, которые отвечают на вопросы, мне не нужно возражать, у них много места: Спасибо, я знаю это - но мне это интересно :) – tstbu
Не обрабатывается ОЗУ, процессор читает куски , как правило, 16 байт за раз в кеш. Большой мультиплексор перемещает правые байты оттуда в регистр CPU. Перетасовка байта занимает столько же времени, сколько и int. –
Удалось ли вам решить эту проблему? Вам все еще нужна помощь? – jcolebrand