【问题标题】:How is the Size of the struct calculated correctly? [duplicate]如何正确计算结构的大小? [复制]
【发布时间】:2014-10-04 00:57:42
【问题描述】:

在 Windows 7 64 位上 MyStruct 的大小是多少?

    typedef struct MyStruct_tag
   {
       char        c;
       double      d;
       int         s;
    } MyStruct;

我的回答:

1 (Char) + 7 (Padding) + 8 (double) + 4 (int) = 20 bytes 

但答案是 24 个字节。到底是怎么回事 ?

【问题讨论】:

  • 最后一个成员之后的 4 个填充位。
  • @hacks 为什么?有什么优势吗?
  • 阅读下面给出的答案以及链接问题中的答案。

标签: c structure


【解决方案1】:

最后的int 后面可能有4 个字节的填充,以便数组中下一个类似结构中double 的对齐将正确对齐。

但归根结底,填充是实现定义的。试图推理或预测它是没有用的。编译器应该为您处理好它。如果没有,请重新考虑你在做什么。

【讨论】:

  • 您可以使用__attribute__((packed)) 指定您不希望结构属性对齐(不是最佳做法)。
【解决方案2】:

这是为了“对齐”。许多处理器无法访问 2 字节和 4 字节的数量(例如整数和长整数),如果它们被塞满各种方式。

假设你有这样的结构:

struct  {
    char a[3];
    short int b;
    long int c;
    char d[3];
    };

现在,您可能认为应该可以像这样将这个结构打包到内存中:

+-------+-------+-------+-------+
|           a           |   b   |
+-------+-------+-------+-------+
|   b   |           c           |
+-------+-------+-------+-------+
|   c   |           d           |
+-------+-------+-------+-------+

但是,如果编译器这样安排,处理器上会容易得多:

+-------+-------+-------+
|           a           |
+-------+-------+-------+
|       b       |
+-------+-------+-------+-------+
|               c               |
+-------+-------+-------+-------+
|           d           |
+-------+-------+-------+

packed'' version, notice how it's at least a little bit hard for you and me to see how the b and c fields wrap around? In a nutshell, it's hard for the processor, too. Therefore, most compilers willpad'' 中的结构(好像带有额外的、不可见的字段)是这样的:

+-------+-------+-------+-------+
|           a           | pad1  |
+-------+-------+-------+-------+
|       b       |     pad2      |
+-------+-------+-------+-------+
|               c               |
+-------+-------+-------+-------+
|           d           | pad3  |
+-------+-------+-------+-------+

礼貌 - 史蒂夫峰会

【讨论】:

  • 在上面的地图中,您是否假设 int 是 2 字节?
猜你喜欢
  • 2021-08-08
  • 1970-01-01
  • 2019-05-08
  • 2016-06-06
  • 2011-02-09
  • 2015-06-03
  • 1970-01-01
  • 2013-07-05
  • 2019-10-05
相关资源
最近更新 更多