我最近偶然发现了一个“hacky”的答案(this one),其中提到因为(我假设32位)C / C ++指针通常是4字节对齐,每个指针的最后2位始终为零。我不明白为什么会这样。为什么不使用所有32位来表示地址?
请忽略我上面链接的实际答案的优点。我只对2 LSB的观察感兴趣。
答案 0 :(得分:2)
如果您指向的地址都是四字节对齐的,则不会有任何地址不是四的倍数,换句话说,两个最低位始终为零。因此,你可以极其苛刻地将它们用于其他目的。
答案 1 :(得分:2)
您可能会注意到该声明中的“通常”关键字。 “通常”并不意味着“总是”。如果某些事情并非总是如此,你就不能认为它是真的,只是砍掉最后两位。
大多数指向活动对象的指针将具有至少4个字节的对齐。但是,您可以创建一个char
的数组,这些元素将是字节可寻址的。 99%的情况下发生的事情并不意味着你可以忽略不会发生的最终1%。
大多数指针至少与4个字节对齐的原因是大多数指针是指向对象或基本类型的指针,这些指针本身至少与4个字节对齐。具有4字节对齐的事物包括(对于大多数系统):int
,float
,bool
(是的,真的),任何指针类型,以及它们的大小或更大的任何基本类型。< / p>
包含其中一个的任何对象必须至少与该对象的对齐方式对齐。因此,存储int
的对象与4个字节对齐。包含指针的对象至少对齐4个字节。等等。罕见的是不包括这些基本类型之一的对象。
这就是原因。您要指向的绝大多数数据类型将至少具有4个字节的对齐。