最近复习sizeof的相关用法,发现自己之前理解错误,这里巩固一下。
Visual stdio环境下,默认字节对齐数为8;
技巧:找出结构中所占内存最大的类型,以该类型所占字节数为参照,若前面的变量之和小于该类型所占字节数,则将其补齐到参照类型的字节长度;
一、struct类型的sizeof计算
1、空结构体
/*空结构体*/ struct test { }; //结果:sizeof(test) = 12、一般结构体1
/*一般结构体1*/ struct test { int a; //长度:4,补4个字节-->8 double b; //长度:8(基准) char c; //长度:1,补7个字节-->8 }; /*说明: *步骤1:因为此结构体中占用内存最长的是double类型的变量b,所以以变量b为基准,8个字节; *步骤2:基准前面的变量a只占4个字节,所以需要补4个字节,对齐后a变量就占用:原本字节(4) + 对齐的字节(4) = 8个字节; *步骤3:基准后面的c只占1个字节,需要补7个字节,故变量c所占字节数为:原本字节:1 + 对齐的字节:7 = 8;综合结构体大小为:8 + 8 + 8 = 24 *步骤4:结果:sizeof(test) = 16 + 8 = 24 */3、一般结构体2
/*一般结构体2*/ struct test { char a;//长度:1,补7个字节-->8 double b;//8(基准) int c; bool d; //c+d长度:5,补3个字节-->8 }; /*说明: *步骤1:因为此结构体中占用内存最长的是double类型的变量b,所以以变量b为基准,8个字节; *步骤2:基准前面的变量a只占1个字节,所以需要补7个字节,对齐后a变量就占用:原本字节(1) + 对齐的字节(7) = 8个字节; *步骤3:基准后面的c和d分别占4个字节和1个字节,由于c+d所占总字节数为5,小于基准8,所以需要补3个字节,即对齐后的c和d总占用:原本字节(5) + 对齐的字节(3) = 8个字节; *步骤4:故该结构体所占内存大小为:8(变量a) + 8(变量b) + 8(变量c+d) = 24 */4、包含数组的结构体
struct test { int a; //长度:4,补4个字节-->8 double b; //8 char c[10]; //长度:10,补6个字节-->16 }; /*说明: *步骤1:因为此结构体中占用内存最长的是double类型的变量b,所以以变量b为基准,8个字节; *步骤2:基准前面的变量a只占4个字节,所以需要补4个字节,对齐后a变量就占用:原本字节(4) + 对齐的字节(4) = 8个字节; *步骤3:基准后面的c占了10个字节,需要补齐为基准的整数倍(即2*8=16),所以需要补6个字节,即对齐后的c和d总占用:原本字节(10) + 对齐的字节(6) = 16个字节; *步骤4:故该结构体所占内存大小为:8(变量a) + 8(变量b) + 16(数组c) = 32 */5、内嵌结构体情况一
/*内嵌结构体情况一*/ struct test1 { char a; //1 int b; //4 //长度:1+4=5,补3个字节-->8 double c; //8(基准) bool d; //长度:1,补7个字节-->8 }; /*说明: *步骤1:因为此结构体中占用内存最长的是double类型的变量c,所以以变量c为基准,8个字节; *步骤2:基准前面的变量a和b共占1+4=5个字节,所以需要补3个字节,对齐后a、b变量共占用:原本字节(5) + 对齐的字节(3) = 8个字节; *步骤3:基准后面的d占了1个字节,需要补齐为基准的整数倍(即1*8=8),所以需要补7个字节,即对齐后的d占用:原本字节(1) + 对齐的字节(7) = 8个字节; *步骤4:故该结构体所占内存大小为:8(变量a+b) + 8(变量c) + 8(变量d) = 24 */ struct test2 { char a; //长度:1,补7个字节-->8 test1 b; //24(基准) int c; //长度:4,补4个字节-->8 }; /*说明: *步骤1:因为此结构体中占用内存最长的是变量b,所以以变量b为基准,24个字节; *步骤2:基准前面的变量a占1个字节,所以需要补7个字节,对齐后a变量共占用:原本字节(1) + 对齐的字节(7) = 8个字节; *步骤3:基准后面的c占了4个字节,需要补齐为基准的整数倍(即1*8=8),所以需要补4个字节,即对齐后的d占用:原本字节(4) + 对齐的字节(4) = 8个字节; *步骤4:故该结构体所占内存大小为:8(变量a) + 24(变量b) + 8(变量d) = 40 */ //结果:sizeof(test2) = 32 + 8 = 406、内嵌结构体情况二
//内嵌结构体情况二 struct test4 { char a; //1 int b; //4 }; //sizeof(test4) = 8 struct test5 { char c; //1 test4 d; //8 //长度:(1+7)+8=16 double e; //8(由于结构体d中成员变量最大为4字节,所以以变量e为基准) bool f; //长度:1+7=8 }; //结果:sizeof(test5) = 24 + 8 = 32二、union类型的sizeof计算
1、一般联合体类型
/*一般联合体类型*/ union un { int a; //长度4 double b; //长度8 char c; //长度1 int d; //长度4 }; 结果:其中占用内存最长的:sizeof(un) = 82、包含数组的联合体1
/*数组型1*/ union test { int a; //4 double b; //8 char c[10]; //1 * 10 = 10 }; //联合体最大数据类型为c[10],长度为10,进行内存对齐后,联合体长度应为2*8=163、包含数组的联合体2
/*数组型2*/ union un { int a[7]; //长度 -> 4 * 7=28 double b; //长度 -> 8 char c[10]; //长度 -> 1 * 10 int d[3]; //长度 -> 3 * 4=12 }; //可知最长的为a[7],长度为28,但需要内存对齐,所以结果:sizeof(un) = 324、嵌套型
/*嵌套型*/ union number { int i; //长度:4 struct { char first; //长度:1 char second; //长度:1 }half; }num; //其中half结构体长度为1+1=2 -> 8,但最长的类型是char,小于结构体number中的int,所以结果:sizeof(num) = 4OK,目前就这些,有补充的话欢迎各位踊跃发言