百度的笔试题
的大小是_____:
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中都通过测试
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中都通过测试