最近看书总是遇到定义一个结构体,然后问你sizeof(此结构体)的值是多少?
本人看了看一书,由做了些实验。总结一下:
1:
Java代码
- struct Foo{
- int a;
- union U{
- }u;
- };
- int main()
- {
- printf("%d\n",sizeof(Foo));
- system("pause");
- return 0;
- }
输出:8
因为空的Union占一个字节。默认4字节对齐。
2:
Java代码
- #pragma pack(2)
- struct Foo{
- int a;
- union U{
- }u;
- };
- int main()
- {
- printf("%d\n",sizeof(Foo));
- system("pause");
- return 0;
- }
这样要是指定是2字节对齐,那么输出结果就是2了。
3:
Java代码
- #pragma pack(2)
- struct Foo{
- int a;
- union U{
- };
- };
- int main()
- {
- printf("%d\n",sizeof(Foo));
- system("pause");
- return 0;
- }
注意这里有一个陷阱,union没有声明变量,只有一个定义。所以输出结果为:4(仅为int的字节数)
4:
Java代码
- 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:
Java代码
- 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中也是一样。甚至改成:
Java代码
- struct Foo{
- }s;
- union E{
- }e;
sizeof(e)和sizeof(s)也是1。
6:接下来言归正传,##pragma pack(n)有时候是会失效的(在n>struct成员占位最大的那个值的时候失效)。比如:
Java代码
- #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)才会有效。
比如:
Java代码
- #pragma pack(4)
- struct Foo{
- double b;
- char a;
- char c;
- };
- int main()
- {
- printf("%d\n",sizeof(Foo));
- system("pause");
- return 0;
- }
运行结果是:
12
7:函数和类型重定义不占空间,比如:
Java代码
- struct Foo{
- void foo(int a){} //不带分号
- typedef int INT; //带分号
- };
- int main()
- {
- printf("%d\n",sizeof(Foo));
- system("pause");
- return 0;
- }
结果:
1
8:enum的声明是不占字节的。enum变量占四个字节。
Java代码
- struct Foo{
- enum Color{a,b} f;
- };
- int main()
- {
- printf("%d\n",sizeof(struct Foo));
- system("pause");
- return 0;
- }
- //结果
- 4
Java代码
- struct Foo{
- enum Color{a,b};
- };
- int main()
- {
- printf("%d\n",sizeof(struct Foo));
- system("pause");
- return 0;
- }
- //结果
- 1
Java代码
- enum Kala{fa,faa,faaa};
- int main()
- {
- printf("%d\n",sizeof(enum Kala));
- system("pause");
- return 0;
- }
- //结果
- 4
9:好了先到这里,看一个题:
猜猜下面sizeof(Foo)输出多少?
Java代码
- #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)