测试程序:
-
#include <iostream>
-
using namespace std;
-
-
struct B
-
{
-
int a;
-
char b;
-
};
-
-
struct S1
-
{
-
int a;
-
char b;
-
short c;
-
char d;
-
};
-
-
struct S2
-
{
-
int a;
-
char b;
-
short c;
-
};
-
-
struct S3
-
{
-
int a;
-
char b;
-
short c;
-
char d;
-
B e;
-
};
-
-
struct S4
-
{
-
int a;
-
char b;
-
short c;
-
char d;
-
B e;
-
char* f;
-
};
-
-
main()
-
{
-
cout<< "sizeof(B):" << sizeof(B) << endl;
-
cout<< "sizeof(S1):" << sizeof(S1) << endl;
-
cout<< "sizeof(S2):" << sizeof(S2) << endl;
-
cout<< "sizeof(S3):" << sizeof(S3) << endl;
-
cout<< "sizeof(S4):" << sizeof(S4) << endl;
-
cout<< "sizeof(double)"<< sizeof(double) << endl;
-
return 0;
-
}
64位机输出:
-
sizeof(B):8
-
sizeof(S1):12
-
sizeof(S2):8
-
sizeof(S3):20
-
sizeof(S4):32
-
sizeof(double)8
32位机输出:
-
sizeof(B):8
-
sizeof(S1):12
-
sizeof(S2):8
-
sizeof(S3):20
-
sizeof(S4):24
-
sizeof(double)8
两个准则:
1、成员的偏移量必须是成员自身大小的整数倍;
2、结构体首地址、大小都必须是最宽基本类型成员大小的整数倍;
另外,展开后的结构体的首成员的偏移量应当是被展开结构体中最宽成员大小的整数倍。
总之,一切方便系统存取数据。
参考文章:
linux下字节对齐
如何计算结构体的大小 (文章有一处错误,double在linux下应该也是8字节)
阅读(546) | 评论(0) | 转发(0) |