如何正确计算结构的大小?

时间:2014-08-11 08:47:36

标签: c structure

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字节。到底是怎么回事 ?

2 个答案:

答案 0 :(得分:4)

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

但最终,填充是实现定义的。试图推理或预测它是没有用的。编译器应该为您处理它。如果没有,请强烈重新考虑你正在做的事情。

答案 1 :(得分: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 will垫''结构(好像有额外的,不可见的字段),如下所示:

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

礼貌 - 史蒂夫峰会