c/c++中使用sizeof计算结构体struct和类class的长度(字节)
结构体求sizeof
在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体内最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在的长度大于处理器位数的,那么就以处理器的位数为对齐单位。结构体内类型相同的连续元素,将在练习的空间内,和数组一样。多说无益,直接看程序。
struct {short a1;short a2;short a3;} A; struct {short a1;long a2;} B; cout<<sizeof(A)<<endl; cout<<sizeof(B)<<endl;
大家猜测结果是什么呢?
很多人以为是:6和6
正确答案是:6和8
为什么呢?
结构体A中有三个short类型的变量,各自以2字节对齐,长度为6字节。6是最大长度2的整数倍。故sizeof(A)=6;
结构体B中,long 占用4个字节,short占用2个字节,共6个字节,但是6不是4的整数倍,于是需要补空自己,增到8字节,即sizeof(B)=8
对类求sizeof
关于类,我将以两个例子来说明列1:
class Student{ public : bool isGirl; int age; bool beautiful; };
cout<<sizeof(Student);
结果为:12
列2:
class Student{ public : bool isGirl; int age; bool beautiful; };
cout<<sizeof(Student);
结果:8 为什么会出现这种情况呢? 解析:这跟内存中数据对齐有关系。 列1对齐方式 |---------bool----------------|---------------------|---------------------|----------------------------| 三个字节用空格填充 |----------------------------------------------------int------------------------------------------------| |---------bool----------------|---------------------|---------------------|----------------------------| 三个字节用空格填充 故12个字节 列2对齐方式 |----------------------------------------------------int------------------------------------------------| |---------bool----------------|----------bool-----------|---------------------|----------------------| 2个字节用空格填充 故8个字节 列3:
class Student{ public : int age; static int schoolNum; };
cout<<sizeof(Student)<<endl;结果:4 解析:因为静态变量式存放在全局数据区的,而sizeof计算栈中分配的大小,所以sizeof(Student)=4
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。