Используют ли 4-байтовые выравнивающие указатели какие-либо отступы? - PullRequest
1 голос
/ 14 февраля 2012

Недавно я наткнулся на «хакерский» ответ ( этот ), где упоминалось, что, поскольку (я предполагаю, 32-битные) указатели C / C ++ обычно выровнены на 4 байта, последние 2 бита каждого указателя всегдануль.Я не понимаю, почему это должно быть так.Почему бы не использовать все 32 бита для представления адреса?

Пожалуйста, не обращайте внимания на достоинства фактического ответа, на который я ссылался выше.Меня интересуют только наблюдения, касающиеся двух младших битов.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Вы можете заметить ключевое слово «обычно» в этом утверждении.«Обычно» не означает « всегда ».И если что-то не всегда верно, вы не можете предположить, что это правда, и просто отрубить последние два бита.

Большинство указателей на живые объекты будут иметь выравнивания по крайней мере 4 байта.Тем не менее, вы можете создать массив char s, и эти элементы будут адресуемы в байтах.То, что что-то происходит в 99% случаев, не означает, что вы можете игнорировать последние 1% там, где этого не происходит.

Причина, по которой большинство указателей выровнены по крайней мере с 4 байтами, заключается в том, что большинство указателей являются указателямиобъектам или базовым типам, которые сами выровнены как минимум до 4 байтов.Вещи, которые имеют 4-байтовое выравнивание, включают (для большинства систем): int, float, bool (да, действительно), любой тип указателя и любой базовый тип, их размер или больше.

Любойобъект, который содержит один из них, должен быть выровнен по крайней мере до выравнивания этого объекта.Таким образом, объект, который хранит int, выровнен до 4 байтов.Объект, который содержит указатель, выровнен как минимум до 4 байтов.И так далее.Редкий объект, который не включает ни одного из этих основных типов.

Вот почему.Подавляющее большинство типов данных, на которые вы хотите указать, будут иметь минимум 4 байта выравнивания.

2 голосов
/ 14 февраля 2012

Если все адреса, на которые вы указываете, выровнены на четыре байта, то не будет никаких адресов, не кратных четырем, или, другими словами, два младших бита всегда будут равны нулю.Таким образом, вы могли бы чрезвычайно хакерски присвоить их для других целей.

...