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