三个准则:
1:结构体变量的首地址能够被其最宽基本类型成员的大小整除;
2:结构体变量中成员的偏移量必须是成员大小的整数倍
3:结构体变量大小必须是所有成员大小的整数倍,即所有成员大小的公倍数
eg:
结构体 地址 变量 说明
struct st1 { 1000
char c1; 1001 char c1 一个字节
char c2; 1002 char c2 一个字节
1003
1004
int a; 1005 int a 四个字节
1006
1007
1008
}num;
sizeof(num) = 8;st1的内存大小为8,因为内存对齐int是四个字节char为1个字节,c1,c2都是char所以还需要补两个字节
eg:
struct test1
{
char a;
int b;//a,b补齐占8个字节
double c;//8个字节
bool d;//对齐需要8个字节
}num;
sizeof(num) = 24
eg:
struct test2
{
char a;//8个字节
struct test1 b;//24个字节
int c;//8个字节
}num;
sizeof(num) = 40;
eg:
struct test3
{
char a;//4个字节
long b;//4个字节
static long c;//4个字节
}num;
sizeof(num) = 8个字节
因为sizeof统计的栈中分配的内存大小而static保存在全局变量区