struct tagSTRUCT {
char c;
short s;
int i;
long l;
} ST;
cout << sizeof(ST) << endl;
变量名 | 字节数 | 起始地址 | 结束地址 |
---|---|---|---|
c | 1 | 0 | 0 |
s | 2 | 2 | 3 |
i | 4 | 4 | 7 |
l | 8 | 8 | 15 |
sizeof(ST)的值为16,重点是short类型的s,它占2个字节,它只能从2的倍数的地址开始,所以它跳过了1地址,由2地址开始。
struct tagSTRUCT {
char c;
long l;
short s;
int i;
} ST;
变量名 | 字节数 | 起始地址 | 结束地址 |
---|---|---|---|
c | 1 | 0 | 0 |
l | 8 | 8 | 15 |
s | 2 | 16 | 17 |
i | 4 | 20 | 23 |
sizeof(ST)的值为24,这次long类型的s提到了第二,占8字节(这里定义为8字节),也就是说它只能从8的倍数的地址开始,所以它跳过了1地址,由8开始;然后short类型的s,刚好到它就是16地址,不用跳直接就在那里开始,占16、17地址;然后是int型的i,它只能从4的倍数的地址开始,16已经过了,只能从20开始,到23共4个字节。
如果上面的加入编译指令#pragma pack(4)呢?就会变成:
变量名 | 字节数 | 起始地址 | 结束地址 |
---|---|---|---|
c | 1 | 0 | 0 |
l | 8 | 4 | 11 |
s | 2 | 12 | 13 |
i | 4 | 16 | 19 |