Do 4字节对齐的指针使用任何填充
Do 4byte aligned pointers use any padding?
我最近偶然发现了一个"破解"的答案(这个),其中提到因为(我假设32位)C/C++指针通常是4字节对齐的,所以每个指针的最后2位总是零。我不明白为什么会这样。为什么不使用全部32位来表示地址?
请忽略我上面提到的实际答案的优点。我只对有关2个LSB的观察结果感兴趣。
您可能会注意到该语句中的关键字"normal"。"通常"并不意味着"总是"。如果某件事并不总是真的,你不能假设它是真的,就把最后两部分剪掉。
大多数指向活动对象的指针将具有至少4个字节的对齐。但是,您可以创建一个char
s的数组,这些元素将是字节可寻址的。99%的时间都会发生一些事情,但这并不意味着你可以忽略最后1%没有发生的事情。
大多数指针与至少4个字节对齐的原因是,大多数指针都是指向对象或基本类型的指针,这些对象或类型本身与至少4字节对齐。具有4字节对齐的东西包括(对于大多数系统):int
、float
、bool
(是的,真的),任何指针类型,以及任何大小或更大的基本类型。
任何包含其中一个的对象都必须至少与该对象的对齐方式对齐。因此,存储int
的对象与4个字节对齐。包含指针的对象至少对齐4个字节。等等稀有是指不包括这些基本类型之一的对象。
这就是为什么。您要指向的绝大多数数据类型都至少有4个字节的对齐。
如果你指向的地址都是四字节对齐的,那么就不会有任何地址不是四的倍数,或者换句话说,两个最低的位总是零。因此,你可以非常巧妙地将它们用于其他目的。
相关文章:
- 在c++中用vector填充一个简单的动态数组
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何使用用户输入在C++中正确填充2D数组
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何找到大小'x'数组是否完全填充,在C++?
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 通过for循环使用用户输入填充列表
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 编译时检查以确保结构中的任何位置都没有填充
- GLSL着色器不渲染任何内容,VAO已填充,VBO已填充顶点
- 浮点结构是否有任何填充
- 是否有任何环境会导致"int"结构填充?
- 如何在没有STL的情况下从2d阵列中删除任何未填充的插槽
- Do 4字节对齐的指针使用任何填充
- 当从列表中获取值时,我填充其中的数组不返回任何值
- 通过new[]分配n个字节,并用任何类型填充它