struct内存分配

百度的笔试题

struct s1 {
char ch, *ptr;
union {
short a, b;
unsigned int c:2, d:1;
}
struct s1 next;
};

的大小是_____:
A. 12字节 B.16字节 C.20字节 D. 24字节
答案:12字节
简单的一道问题,蕴涵着丰富的C++内存管理原则和基础知识。
为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
char 偏移量必须为sizeof(char)即1的倍
short 偏移量必须为sizeof(short)即2的倍数
int 偏移量必须为sizeof(int)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
参考:http://www.programfan.com/blog/article.asp?id=38666
下面来分析一下上面的问题
char ch 起始偏移量0 占一个字节
char *ptr 起始偏移量1,指针类型占4字节,因此必须填充3个字节
union 的字节数为内部成员中字节数最大的值,在此为2个字节,union的起始偏移量为8个字节,无需填充。
综上struct的占的字节数为1+3+4+2=10BYTE,但是,不是结构的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(*ptr)=4)的倍数,所以需要填充2个字节,以满足结构的大小为sizeof(*ptr)=4的倍数。
所以该结构总的大小为:sizeof(s1)为1+3+4+2+2=12。其中总的有2+3=5个字节是自动填充的,没有放任何有意义的东西。
以上代码在VC,GCC中都通过测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值