最近看书总是遇到定义一个结构体,然后问你sizeof(此结构体)的值是多少?
本人看了看<<深入理解计算机系统>>一书,由做了些实验。总结一下:
1:
struct Foo{
int a;
union U{
}u;
};
int main()
{
printf("%d\n",sizeof(Foo));
system("pause");
return 0;
}
输出:8
因为空的Union占一个字节。默认4字节对齐。
2:
#pragma pack(2)
struct Foo{
int a;
union U{
}u;
};
int main()
{
printf("%d\n",sizeof(Foo));
system("pause");
return 0;
}
这样要是指定是2字节对齐,那么输出结果就是2了。
3:
#pragma pack(2)
struct Foo{
int a;
union U{
};
};
int main()
{
printf("%d\n",sizeof(Foo));
system("pause");
return 0;
}
注意这里有一个陷阱,union没有声明变量,只有一个定义。所以输出结果为:4(仅为int的字节数)
4:
struct Foo{
};
union E{
};
int main()
{
printf("%d\n",sizeof(struct Foo));
printf("%d\n",sizeof(union E));
system("pause");
return 0;
}
这样的话,输出都为1。
结果:
1
1
5:
struct Foo{
union E{
};
};
int main()
{
printf("%d\n",sizeof(struct Foo));
//printf("%d\n",sizeof(union E));
system("pause");
return 0;
}
结果:
1
反之将struct放进union中也是一样。甚至改成:
struct Foo{
}s;
union E{
}e;
sizeof(e)和sizeof(s)也是1。
6:接下来言归正传,##pragma pack(n)有时候是会失效的(在n>struct成员占位最大的那个值的时候失效)。比如:
#pragma pack(4)
struct Foo{
char a;
char b;
char v;
};
int main()
{
printf("%d\n",sizeof(Foo));
system("pause");
return 0;
}
因为,结构体最大的占位成员占1字节,所以#pragma pack(4)失效。按照1字节对齐,输出结果:
3
所以只有在n>struct成员占位最大的那个值的时候(对于数组结构,只取其一个元素所占的大小进行比较),#pragma pack(n)才会有效。
比如:
#pragma pack(4)
struct Foo{
double b;
char a;
char c;
};
int main()
{
printf("%d\n",sizeof(Foo));
system("pause");
return 0;
}
运行结果是:
12
7:函数和类型重定义不占空间,比如:
struct Foo{
void foo(int a){} //不带分号
typedef int INT; //带分号
};
int main()
{
printf("%d\n",sizeof(Foo));
system("pause");
return 0;
}
结果:
1
8:enum的声明是不占字节的。enum变量占四个字节。
struct Foo{
enum Color{a,b} f;
};
int main()
{
printf("%d\n",sizeof(struct Foo));
system("pause");
return 0;
}
//结果
4
struct Foo{
enum Color{a,b};
};
int main()
{
printf("%d\n",sizeof(struct Foo));
system("pause");
return 0;
}
//结果
1
enum Kala{fa,faa,faaa};
int main()
{
printf("%d\n",sizeof(enum Kala));
system("pause");
return 0;
}
//结果
4
9:好了先到这里,看一个题:
猜猜下面sizeof(Foo)输出多少?
#pragma pack(2)
struct Foo
{
int i;
union U
{
char buff[13];
int i;
}u;
void foo() { }
typedef char* (*f)(void*);
enum{red, green, blue} color;
};
int main()
{
printf("%d\n",sizeof(struct Foo));
system("pause");
return 0;
}
//结果:
22(4+13+1+4)