1)枚举类enum型空间计算html
enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当作int来存储的,因此枚举类型的sizeof值都为4post
1 enum color(red,pink,white,black)c; 2 void main() 3 { 4 cout<<sizeof(enum); //值为4 5 }
2)公用体union空间计算url
公用体中的成员公用同一段内存,因此整个联合体的sizeof是全部成员中占用内存最大的成员的sizeof,联合体要考虑内存对齐,具体规则下面会讲spa
1 union st{ 2 char a[9]; 3 int b[2]; 4 }s; 5 void mian() 6 { 7 cout<<sizeof(s); //值为12 8 }
结果分析:sizeof(a)=9*1=9,sizeof(b)=2*4=8,选二者中最大的一个,即9,考虑内存对齐,总体空间长度要是公用体中长度最大的数据类型的整数倍,在这里是int占用空间的整数倍,比9大的且是4的整数倍的最小数是12设计
3)结构体struct空间计算code
1.总体空间是结构体中占用空间最大的类型所占字节数的整数倍。特殊:在32位Linux+gcc环境下,若最大的类型所占字节数超过4,如double是8,则总体空间大小是4的整数倍便可htm
2.数据对齐原则-内存按结构体成员的前后顺序排列,当排到该成员变量时,其前面全部成员已经占用的空间大小必须是该成员类型大小的整数倍,若是不够,则前面的成员占用的空间要补齐,使之成为当前成员类型的整数倍。特殊:在Linux+gcc环境下,若当前成员类型字节数超过4,则前面全部成员已经占用的空间大小是4的整数倍便可,不够则补齐blog
范例:内存
1 struct s{ 2 char a; 3 double b; 4 int c; 5 char d; 6 }; 7 void main() 8 { 9 cout<<sizeof(s); //值为24 10 }
结果分析:首先s中最大的类型为double,长度为8;顺序存放s中的成员,sizeof(a)=1,占用一个字节,下一个成员b是double类型,占用8个字节,根据原则2,a占用的内存补齐8的整数倍,即补齐到8个字节,b从第9个字节开始存放,此时共占用16个字节,下一个成员c是int类型,占用4个字节,16是4的整数倍,不用补齐,顺序存放c,此时占用空间来到20,d占用一个字节,20+1=21,根据原则1,总体空间大小需是double类型长度的整数倍,需将21补齐到24个字节get
规则同上面基本相同,但计算时,设计到的倍数对齐,以子结构体中的最大成员类型占用的空间为基础,而不是将子结构体的总体空间为基础,具体以下:
1.总体空间是子结构体与父结构体中占用空间最大的类型所占字节数的整数倍。特殊:在32位Linux+gcc环境下,若最大的类型所占字节数超过4,如double是8,则总体空间大小是4的整数倍便可
2.数据对齐原则-内存按结构体成员的前后顺序排列,当排到子结构体成员时,其前面全部成员已经占用的空间大小必须是该子结构体成员中占用空间最大的类型大小的整数倍,若是不够,则前面的成员占用的空间要补齐,使之成为该类型大小的整数倍。特殊:在Linux+gcc环境下,若当前成员类型字节数超过4,则前面全部成员已经占用的孔家大小是4的整数倍便可,不够则补齐
1 struct s1{ 2 char c; 3 int i; 4 }; 5 6 struct s2{ 7 char c1; 8 s1 s; 9 char c2; 10 }; 11 12 void mian() 13 { 14 cout<<sizeof(s1)<<endl; //8 15 cout<<sizeof(s2)<<endl; //16 16 }
结果分析:
s1:c占一个字节,i占4个字节,存放i以前将其补齐到4个字节,i从第5个字节开始存放,此时总体空间大小是8,刚好是4的整数倍
s2:c1占一个字节,下一个成员s,这里sizeof(s)虽然等于8,但计算时前面占用空间只要是s中最大类型的空间长度的整数倍便可,s中最大类型是int,因此c1占用的内存补齐到4,而后存放s(注意这里存放的是s,而不是int占用的字节),已计算出sizeof(s)=8,此时总体空间来到12,c2占一个字节,12+1=13,根据原则1,总体空间大小需是父结构体和子结构体重最大类型长度int的整数倍,最近的是16.