最近复习sizeof的相关用法,发现自己之前理解错误,这里巩固一下
第一部分:struct类型的sizeof计算
类型一:空结构体
/*空结构体*/
struct test
{
};
//结果:sizeof(test) = 1
类型二:一般结构体1
/*一般结构体1*/
struct test
{
int a; //长度:4
double b; //长度:8
//部分一:8+4=12——>内存对齐后为:16
char c; //长度:1
//部分二:1——>内存对齐后为:8
};
//因为此结构体占用内存最长的是b,所以从dobule处开始分为两部分进行讨论
//结果:sizeof(test) = 16 + 8 = 24
类型二:一般结构体2
/*一般结构体2*/
struct test
{
char a;//1
double c;//8
//部分一:1+8=9 -> 16
int b;//4
bool d;//1
//部分一:4+1=5 -> 8
};
类型三:包含数组的结构体
struct test
{
int a; //4
double b; //8
//部分一:4+8=12 -> 16
char c[10]; //10
//部分二:1 * 10 = 10 -> 16
};
输出长度为32
类型四:内嵌结构体情况一
/*内嵌结构体情况一*/
struct test1
{
char a; //1
int b; //4
double c; //8
bool d; //1
};
//sizeof(test1) = 24
struct test2
{
char a; //1
test1 bb; //24
//25->32
int cc; //4
//4->8
};
//结果:sizeof(test2) = 32 + 8 = 40
类型四:内嵌结构体情况二
//内嵌结构体情况二
struct test4
{
char a; //1
int b; //4
};
//sizeof(test4) = 8
struct test5
{
char c; //1
test4 d; //8(该结构体成员变量最大为4字节,所以从double开始分)
double e; //8
//第一部分:1+8+8=17 -> 24
bool f; //1
//第二部分:1 -> 8
};
//结果:sizeof(test5) = 24 + 8 = 32
第二部分:union类型的sizeof计算
类型一:一般联合体类型
/*一般联合体类型*/
union un
{
int a; //长度4
double b; //长度8
char c; //长度1
int d; //长度4
};
结果:其中占用内存最长的:sizeof(un) = 8
类型二:包含数组的联合体1
/*数组型1*/
union test
{
int a; //4
double b; //8
char c[10]; //1 * 10 = 10
};
//联合体最大数据类型为c[10],长度为10,进行内存对齐后,联合体长度应为2*8=16
类型二:包含数组的联合体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) = 32
类型三:嵌套型
/*嵌套型*/
union number
{
int i; //长度:4
struct
{
char first; //长度:1
char second; //长度:1
}half;
}num;
//其中half结构体长度为1+1=2 -> 8,但最长的类型是char,小于结构体number中的int,所以结果:sizeof(num) = 4
OK,目前就这些,有补充的话欢迎各位踊跃发言