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字节。到底是怎么回事 ?
答案 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 |
+-------+-------+-------+-------+
礼貌 - 史蒂夫峰会