fre*_*low 12 c++ arrays struct class padding
可能重复:
具有单个元素的struct的大小
给定任何类型A和以下结构:
struct S
{
A a;
};
Run Code Online (Sandbox Code Playgroud)
有没有sizeof(S)大于的情况sizeof(A)?
例如,可以sizeof(std::array<T, n>)大于sizeof(T[n])?
能够在S内部使用A意味着编译器已经知道A的结构并且已经向其添加了填充字节.我认为没有理由为S添加更多填充,因为它已经对齐了.
虽然结构可以被填充,但在我知道的所有系统上,编译器都会填充,以便结构的对齐方式与其成员的最大对齐方式相同。这样做是为了使结构数组始终正确对齐。
\n\n所以:
\n\nstruct S \n{\n char a;\n} // Size 1, no padding\n\nstruct S2 \n{\n unsigned int a;\n char b;\n} // Size 8, 3 bytes padding (assuming 32 bit integer)\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:请注意,编译器还可以添加内部填充,以保持数据的对齐正确。
\n\nC/C++ 标准没有指定任何这些细节。您想要的是您正在运行的系统的 C ABI(应用程序二进制接口),它应该指定结构的默认布局(编译器可以选择覆盖它,如果他们认为合适,另请参阅#pragma pack)。例如,请查看X86_64 ABI第 13 页,其中指出:
\n\n\n\n聚合和联合 结构和联合假定其最严格对齐的组件对齐。每个成员都被分配到具有适当对齐方式的最低可用偏移量。任何对象的大小始终是对象对齐方式的倍数。数组使用与其元素相同的对齐方式,但长度至少为 16 字节的本地或全局数组变量或 C99 可变长度数组变量始终具有至少 16 字节的对齐方式。结构和联合对象可能需要填充以满足大小和对齐约束。任何填充的内容都在 de\xef\xac\x81ned 下。
\n
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |