可以在结构中包装类型会导致额外的填充吗?

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])

Luc*_*ore 5

能够在S内部使用A意味着编译器已经知道A的结构并且已经向其添加了填充字节.我认为没有理由为S添加更多填充,因为它已经对齐了.

  • 编译器会在第一次遇到声明时向A添加填充,而不是以后...例如,struct A {char x,int y}; 已经填补了. (5认同)

Dav*_*e S 3

虽然结构可以被填充,但在我知道的所有系统上,编译器都会填充,以便结构的对齐方式与其成员的最大对齐方式相同。这样做是为了使结构数组始终正确对齐。

\n\n

所以:

\n\n
struct 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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:请注意,编译器还可以添加内部填充,以保持数据的对齐正确。

\n\n

C/C++ 标准没有指定任何这些细节。您想要的是您正在运行的系统的 C ABI(应用程序二进制接口),它应该指定结构的默认布局(编译器可以选择覆盖它,如果他们认为合适,另请参阅#pragma pack)。例如,请查看X86_64 ABI第 13 页,其中指出:

\n\n
\n

聚合和联合 结构和联合假定其最严格对齐的组件对齐。每个成员都被分配到具有适当对齐方式的最低可用偏移量。任何对象的大小始终是对象对齐方式的倍数。数组使用与其元素相同的对齐方式,但长度至少为 16 字节的本地或全局数组变量或 C99 可变长度数组变量始终具有至少 16 字节的对齐方式。结构和联合对象可能需要填充以满足大小和对齐约束。任何填充的内容都在 de\xef\xac\x81ned 下。

\n
\n

  • @Fred:除了具有 1 个成员的结构遵循与多个成员的结构相同的规则。特别是,如果只有 1 个成员,则结构的对齐方式和大小必须匹配,因此没有填充。同样,编译器可以重写。另外,如果他们在 C++11 中添加了对齐机制,那么我所说的大部分内容在这样的系统上就会变得毫无意义。 (3认同)