gpt4 book ai didi

c++ - 对齐此类结构是否符合 C++ 标准

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:25 27 4
gpt4 key购买 nike

举个例子

class A
{
public:
int a;
char b;
int c;
};

我看到的每个编译器(对于 x86、32 或 64 位)都为类 A 分配 12 个字节,而不是 9 个。因此它们将 b 与整数边界对齐或者你可以说总线边界。我的问题是,这是否符合 C++ 标准,是否有任何编译器不这样做。

最佳答案

C++ 标准规定:

  • 对象有一个对齐要求,它们的大小是一个倍数(所以如果 int 是 4 字节宽,那么它需要 1、2 或 4 字节的对齐,这取决于实现)。
  • 成员对象(如果它们没有被诸如public之类的访问说明符分隔)都按照它们被声明的顺序分配
  • 并根据他们的对齐要求分配他们。

所以不,标准并没有明确规定该类的大小应为 12 字节。

但它的确b应该分配在a之后,c应该分配在a之后b.

int 为 4 字节宽且需要 4 字节对齐的平台上,这会留下 12 字节作为最小有效大小:

  • a 取前 4 个字节
  • b占一个字节
  • c 需要 4 个字节,但是 必须分配在 4 个字节的边界上。 b 在这样的边界过去 一个字节结束,因此通过插入 3 个字节的填充找到下一个放置 c 的有效位置。<

所以类的总大小最终是成员的大小 (4 + 1 + 4 = 9) 加上三个字节的填充,总共 12。

还有一条规则在这里没有效果,但如果您按照 a, c, b 的顺序定义成员,这会很重要。

包含类 (A) 从最严格对齐的成员对象继承对齐要求。也就是说,因为它包含一个 int,所以它具有与 int 相同的对齐要求。并且因为对象的总大小必须是其对齐要求的倍数,所以包含顺序为 a、b、c 的成员的类仍然需要 12 个字节的存储空间。它只是将填充的 3 个字节移到类的末尾,而不是在 bc 之间。

但是,在其他一些情况下,按大小降序对成员重新排序可以有时减少类的大小。

假设我们有一个这样的类:

class B {
char a;
double b;
int c;
};

这将需要 24 个字节的存储空间(a 1 个字节,b 8 个字节,c 4 个字节,但是然后为了确保 b 以 8 字节边界结束,我们需要在 ab< 之间填充 7 字节,并确保整个类最终的大小是 8 的倍数,我们需要在 c 之后再增加 4 个字节。

但是根据大小重新排序成员,像这样:

class B {
double b;
int c;
char a;
};

生成的类只需要 16 个字节:

相同的 1 + 4 + 8 字节用于成员对象本身,但现在 c 已经在 4 字节边界上对齐(因为它位于 b 之后结束于 8 字节边界),并且 a 不需要任何对齐,所以我们唯一需要的对齐方式是确保 B 的大小是 8 的倍数. 成员占用 13 个字节,所以我们可以添加 3 个字节的填充,类最终为 16 个字节,比第一个版本小 33%。

关于c++ - 对齐此类结构是否符合 C++ 标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13290465/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com