【问题标题】:Why is the size of this struct 12 and not 10? [duplicate]为什么这个结构的大小是 12 而不是 10? [复制]
【发布时间】:2012-03-14 05:14:53
【问题描述】:

可能重复:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?

我正在尝试解析 ID3v2 标签,至少获取艺术家、标题和专辑等重要数据,但我无法设置必要的结构。

struct ID3v2_frame{
  char id[4];
  unsigned int size;
  bool flags[2];
};
ID3v2_frame frame;
cout<<sizeof(frame)<<endl;

我认为这是我如何设置 4 字节 int 的问题。 当我输出 sizeof(frame) 它输出 12 时,我的预期输出是 10。 我在 64 位 linux 机器上运行。

【问题讨论】:

  • bool 不是 C 类型。它是如何定义的?
  • 是的,差不多,在我的搜索中没有遇到它,但得到了答案,谢谢
  • @leppie: bool 不是 C89 中的标准类型,但在 #include &lt;stdbool.h&gt; 之后出现在 C99 中(并且 _Bool 在任何时候都是 C99 中的类型)。

标签: c++ struct


【解决方案1】:

请检查您的主程序:

sizeof(bool) //should return 2 my guess
sizeof(char) //should return 1
sizeof(unsigned int) //should return 4

每个编译器可以有不同的数据类型大小。

【讨论】:

    【解决方案2】:

    注意 x64 上的 bool 大小是 2 个字节

    【讨论】:

      【解决方案3】:

      您可以从herehere 找到答案。

      请检查什么包装?默认打包(8)

      【讨论】:

        【解决方案4】:

        这是因为结构包装。编译器会使结构的大小成为 4 字节的倍数。如果您不希望这种情况发生并且在您的情况下看到大小为 10 个字节,请使用 __attribute__((packed))

        struct ID3v2_frame{
        char id[4];
        unsigned int size;
        bool flags[2];
        }__attribute__((packed));
        

        请注意,这可能会影响程序的性能。看到这个问题:

        Can __attribute__((packed)) affect the performance of a program?

        【讨论】:

          【解决方案5】:

          我的猜测是 flags 和 id 数组中的终止符。

          【讨论】:

          • 我似乎记得在我的数据结构类中,当你在数组中声明时,编译器总是在最后抛出一个 /n 来让编译器知道字符串已经完成。所以 id 看起来像 id = [],[],[],[],/n 但我也可能离基地很远。
          猜你喜欢
          • 2014-12-29
          • 2019-02-03
          • 2021-12-18
          • 2015-06-05
          • 2021-05-19
          • 1970-01-01
          • 1970-01-01
          • 2020-07-01
          • 2015-11-15
          相关资源
          最近更新 更多