【问题标题】:how to pack a structure inside a structure如何在结构中打包结构
【发布时间】:2017-06-21 17:36:16
【问题描述】:

让我更清楚, 我想填充内部结构我该怎么做..?例子-

struct b 在哪里

struct b{
  u_int32_t aa;
  u_int32_t bb;
};

struct c{
  u_int64_t cc;
};

现在,我的编译器在结构 d 中的结构 b 和 c 之间填充 8 个字节。那么,我该如何摆脱它呢?

希望,现在清楚了。谁能给我答案?

结构 d{

struct b;

struct c; //I want to make this structure a padded one, how to go about it?

struct c;

}

拜托,谁能帮帮我。

【问题讨论】:

  • C struct padding的可能重复
  • 你用的是什么编译器? GCC 使用 __attribute__ 而 MSVC 使用 #pragma

标签: c compiler-construction padding linux-device-driver


【解决方案1】:

从标签中,我推断您使用的是 linux。 GCC 识别以下属性:

__attribute__((packed))

您可以在结构声明之前或之后编写它以删除填充。

【讨论】:

    【解决方案2】:

    事实上,它没有在 b 和 c 之间放置任何填充

    让我们看看为什么,

    所有u_int32_t 都是 32 位 => 4 字节。现在struct b 的大小将是 8 个字节(4 个因为 aa,4 个因为 bb)。此外,struct c 的大小也是 8 个字节。

    所以当struct d被创建时,struct bstruct c一个接一个地被依次放置。下一个struct c 直接放在前一个struct c 之后。

    但是在最终的struct cstruct d的闭包之后有一个8字节的填充。这是因为,如果要将多个struct d 放置在内存中,则第二个struct d 将最终从内存位置24 而不是32 开始(这很方便)。

    如果您想了解更多信息:The Lost Art of C Structure Packing

    【讨论】:

      猜你喜欢
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 2015-07-31
      • 2013-01-24
      • 1970-01-01
      • 2015-04-13
      相关资源
      最近更新 更多