【问题标题】:Padding of structure type inside structures结构内部结构类型的填充
【发布时间】:2019-07-09 05:31:19
【问题描述】:

当我试图将另一个 struct_a 类型的结构数组放入其中时,我不明白 struct_b 的大小。我知道 struct_a 的大小是 16 个字节。但是说到struct_b,我假设应该有2*16 +160=192字节,但实际上是184字节。你能解释一下吗?谢谢!

struct struct_a{
    char id[5];
    float f;
    int n;
};

struct struct_b{
    char name[24];
    struct struct_a array[10];
};


【问题讨论】:

  • 你从哪里得到的 2*16? name 是 24 个字节。
  • struct_b 中最大的类型是 16 字节,因为 24 >16 ,所以我假设应该有一个填充?

标签: c struct padding


【解决方案1】:

因为namechar 类型。所以它是 1 字节意味着 1 * 24 = 24 bytes 和 sizeof struct_a 是 16 字节。所以,16*10 = 160

这就是为什么 sizeof struct_b 是 184 字节的原因。

24 + 160 = 184 bytes.

【讨论】:

  • 为什么 struct_b 中没有任何填充?和struct_a一样,最大的类型是4个字节,所以字符数组会占用2*4=8个字节。
  • 因为不需要额外的字节。仅当结构成员后跟具有较大对齐要求的成员时才插入填充。
  • 我还是不明白,为什么struct_a没有比char大的要求?前者需要16个字节,比char大吗?
  • 填充与最大成员无关。插入填充以确保下一个成员的地址是其对齐要求的倍数,对齐要求通常但不总是等于其大小,并且通常具有上限(通常为 4 或 8)。不过,这取决于平台。您通常可以通过按大小(降序)对成员进行排序来完全避免填充。
  • @Erlkoenig 您通常可以通过按大小(降序)对成员进行排序来完全避免填充。 这是不正确的,正确的说法是“您可以通过对成员进行排序来优化内存利用率按大小排列的成员”
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 2015-09-04
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
相关资源
最近更新 更多