前言
结构体求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