【问题标题】:structure padding alignment?结构填充对齐?
【发布时间】:2018-03-04 18:50:33
【问题描述】:
typedef struct structc_tag
{
   char        c;
   double      d;
   int         s;
} structc_t;

应用同样的分析,structc_t 需要 sizeof(char) + 7 byte padding + sizeof(double) + sizeof(int) = 1 + 7 + 8 + 4 = 20 bytes 但 sizeof(structc_t) 将是 24 bytes.I不明白对齐方式。任何人都可以帮助我吗?

【问题讨论】:

  • 这个计算是正确的,除非你打包结构并且你在需要对齐访问的 64 位系统上
  • sizeof(char) + 7 字节填充 + sizeof(double) + sizeof(int) + 4 字节填充 = 24
  • @zappy 为什么在最后一个 int 之后多出 4 个字节?
  • @zappy 是不是因为 64 位和 32 位系统的内存需要在 4 字节边界上对齐?
  • 大小需要为 24 以确保数组中的第二个元素正确对齐。

标签: c linux


【解决方案1】:

如果我们把它全部写出来,你的结构看起来像这样:

typedef struct structc_tag
{
   char        c;
   char        pad1[7];
   double      d;
   int         s;
   char        pad2[4];
} structc_t;

pad2 是您不想要的。它发挥作用是因为编译器假设您可能想要创建一个包含这些东西的数组,在这种情况下,每个 d 都必须对齐,所以 sizeof(structc_t) 是 24。

您可以使用编译器特定的扩展来启用结构打包,如下所示:

typedef struct structc_tag
{
   char        c;
   char        pad1[7];
   double      d;
   int         s;
} __attribute__((packed)) structc_t;

现在需要pad1(否则d 将立即跟随您不想要的c)。并且pad2 不再隐式添加,因此大小现在应该是 20。

【讨论】:

  • 是否使用__attribute__((packed)) structc_t 来避免结构末尾的填充?
  • @GauravPathak:是的。它还禁用了内部填充(我们用pad1 重新添加)。
猜你喜欢
  • 2020-07-26
  • 1970-01-01
  • 2016-09-18
  • 2011-10-19
  • 2016-12-28
  • 2012-09-01
  • 2011-08-13
  • 2021-12-28
相关资源
最近更新 更多