以下结构在我的设置中为 16 个字节:
struct MyExampleStruct
{
double d;
char b;
};
由于结构体的大小向上舍入到其最大成员的最小对齐的规则。最大成员的对齐方式为 8,因此它的大小向上舍入为 16。如果我添加一个 int:
struct MyExampleStruct
{
double d;
char b;
int i;
};
仍然是16字节。 char 的对齐方式为 1,因此位于地址 8。int 的对齐方式为 4,因此位于地址 12,占用 4 个字节,结果是 16 个字节,两者都是一样的。现在介绍如下:
struct ContainingStruct
{
MyExampleStruct f;
int i;
};
现在基本上我更喜欢的是与上一个示例中相同的布局,但是因为对齐和填充规则以相同的方式应用,MyExampleStruct 的大小为 16,int 位于地址 16,占用 4字节,即 20,但规则是大小向上舍入到最大成员的对齐方式,因此 ContainingStruct 的大小为 24。我是否可以让编译器在这里变得更高效?
除了使用特定于编译器的编译指示(gcc 的
pragma pack()
)之外,如果对象成为非标准布局,并且它继承该对象而不是包含它,则允许编译器将其成员塞入其中。
struct MyExampleStruct
{
double d;
protected:
char b;
};
struct ContainingStruct : public MyExampleStruct
{
int i;
};
两个对象的大小均为 16,但您丢失了聚合初始值设定项……还有一个虚拟表也算作非标准布局。