Вы можете заметить ключевое слово «обычно» в этом утверждении.«Обычно» не означает « всегда ».И если что-то не всегда верно, вы не можете предположить, что это правда, и просто отрубить последние два бита.
Большинство указателей на живые объекты будут иметь выравнивания по крайней мере 4 байта.Тем не менее, вы можете создать массив char
s, и эти элементы будут адресуемы в байтах.То, что что-то происходит в 99% случаев, не означает, что вы можете игнорировать последние 1% там, где этого не происходит.
Причина, по которой большинство указателей выровнены по крайней мере с 4 байтами, заключается в том, что большинство указателей являются указателямиобъектам или базовым типам, которые сами выровнены как минимум до 4 байтов.Вещи, которые имеют 4-байтовое выравнивание, включают (для большинства систем): int
, float
, bool
(да, действительно), любой тип указателя и любой базовый тип, их размер или больше.
Любойобъект, который содержит один из них, должен быть выровнен по крайней мере до выравнивания этого объекта.Таким образом, объект, который хранит int
, выровнен до 4 байтов.Объект, который содержит указатель, выровнен как минимум до 4 байтов.И так далее.Редкий объект, который не включает ни одного из этих основных типов.
Вот почему.Подавляющее большинство типов данных, на которые вы хотите указать, будут иметь минимум 4 байта выравнивания.