gpt4 book ai didi

c++ - 类型是否可能具有 'n-byte alignment' 以外的对齐要求

转载 作者:可可西里 更新时间:2023-11-01 18:37:50 25 4
gpt4 key购买 nike

例如,考虑以下内容:

假设 int 是 4 字节对齐的,long 是 8 字节对齐的。

struct example
{
int a;
long b;
int c;
};

编译器将其放置在内存中的明显方式是:AAAAPPPPBBBBBBBBCCCCPPPP,整个结构具有 8 字节对齐。

  • P指的是一个字节的padding
  • A指的是a的一个字节
  • B指的是b的一个字节
  • C指的是c的一个字节

在这种情况下,sizeof(example) 是 24。

但另一种方法如下:AAAABBBBBBBBCCCC 整个结构对齐,使得起始字节的地址 mod 8 = 4(不确定如何更简洁地说)

在这种情况下,不需要填充,因此每个实例可以节省 8 个字节。

我的问题是,是否允许编译器这样做(按照标准)?他们真的这样做吗?我一直看到简单地以字节为单位讨论对齐。

最佳答案

结构的对齐要求不能低于其成员的对齐要求。如果结构的成员是 8 字节对齐的,则该结构至少需要 8 字节对齐。如果该结构是 8 字节对齐的,那么在您的示例中,第二个成员不会是 8 字节对齐的,因为它从 8 字节对齐的结构的开头偏移了四个字节,因此它不符合要求.

可能的替代方法是在结构的开头放置填充,但这是不允许的:

C++03 9.2p17

A pointer to a POD-struct object, suitably converted using a reinterpret_cast, points to its initial member (...) and vice-versa. [Note: There might therefore be unnamed padding within a POD-struct object, but not at its beginning, as necessary to achieve proper alignment.]

另一种可能的替代方法是(如您所建议的那样)使 8 字节对齐实际上意味着 ((address%8)==4)(与 (address% 8)==0).如果是这种情况,那么您的 8 字节对齐的 long 将具有相同的要求。不可能同时具有 (address%8)==0(address%8)==4 对齐方式的类型,因为没有办法一般分配满足两种对齐要求的内存。由于 long 也有这种特殊的对齐要求,您仍然无法避免填充。

关于c++ - 类型是否可能具有 'n-byte alignment' 以外的对齐要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20166530/

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