我可以让编译器在这里使用更高效的数据布局吗?

问题描述 投票:0回答:1

以下结构在我的设置中为 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。我是否可以让编译器在这里变得更高效?

c++ memory-alignment
1个回答
0
投票

除了使用特定于编译器的编译指示(gcc 的

pragma pack()
)之外,如果对象成为非标准布局,并且它继承该对象而不是包含它,则允许编译器将其成员塞入其中。

struct MyExampleStruct
{
    double d;
protected:
    char b;
};

struct ContainingStruct : public MyExampleStruct
{
    int i;
};

两个对象的大小均为 16,但您丢失了聚合初始值设定项……还有一个虚拟表也算作非标准布局。

godbolt 演示

© www.soinside.com 2019 - 2024. All rights reserved.