Do 4字节对齐的指针使用任何填充

Do 4byte aligned pointers use any padding?

本文关键字:任何 填充 指针 字节 对齐 Do      更新时间:2023-10-16

我最近偶然发现了一个"破解"的答案(这个),其中提到因为(我假设32位)C/C++指针通常是4字节对齐的,所以每个指针的最后2位总是零。我不明白为什么会这样。为什么不使用全部32位来表示地址?

请忽略我上面提到的实际答案的优点。我只对有关2个LSB的观察结果感兴趣。

您可能会注意到该语句中的关键字"normal"。"通常"并不意味着"总是"。如果某件事并不总是真的,你不能假设它是真的,就把最后两部分剪掉。

大多数指向活动对象的指针将具有至少4个字节的对齐。但是,您可以创建一个chars的数组,这些元素将是字节可寻址的。99%的时间都会发生一些事情,但这并不意味着你可以忽略最后1%没有发生的事情。

大多数指针与至少4个字节对齐的原因是,大多数指针都是指向对象或基本类型的指针,这些对象或类型本身与至少4字节对齐。具有4字节对齐的东西包括(对于大多数系统):intfloatbool(是的,真的),任何指针类型,以及任何大小或更大的基本类型。

任何包含其中一个的对象都必须至少与该对象的对齐方式对齐。因此,存储int的对象与4个字节对齐。包含指针的对象至少对齐4个字节。等等稀有是指不包括这些基本类型之一的对象。

这就是为什么。您要指向的绝大多数数据类型都至少有4个字节的对齐。

如果你指向的地址都是四字节对齐的,那么就不会有任何地址不是四的倍数,或者换句话说,两个最低的位总是零。因此,你可以非常巧妙地将它们用于其他目的。