首先编译环境是vc6.0
在sizeof(结构体)时,内存对齐的方式总结:
首先找到整个结构体中占用字节最大的类型,假设它占用的字节数为M,然后开始按声明顺序依次相加,得到字节数m,如果m总字节数不足M,则往后看下一位的字节n,如果m+n>M,则先不计算n,先将m变为M,然后由n开始计算。(可能表述的不够清楚,还是看例子)
(1) 第一种定义方式
struct A{
int a;
char c;
double b;
};
调用sizeof(A)得到的结果是16。
最大的字节数是8个字节
int型占4个字节,m = 4, m<8
char型占1个字节,4+1 = 5 < 8
double型占8个字节,5+8>8;
所以5个字节先对齐,变为8个字节。
然后再看double,8+8=16个字节。
(2)第二种定义方式
struct B
{
int a;
char c;
int d;
double b;
};
调用sizeof(B)得到的结果是24。
int型占4个字节,m = 4 < 8
遇到char型, m = 5 < 8
遇到int型,m + n > 8,
所以前5个字节先对齐变为8,
再看int型,为4
double为8,4+8>8
所以4个字节也内存对齐变为8个字节
看double型,8个字节。8+8+8=24。
(3)第三种定义方式
struct C
{
int a;
char c;
char d;
double b;
};
调用sizeof的结果是16
4 < 8
4+1 < 8
4+1+1<8
4+1+1+8>8,4+1+1 = 8
8+8 = 16。
(4)第四种定义方式
struct D{
int a;
double b;
char c;
};
调用sizeof的结果是24
4 < 8
4+8>8
4 = 8, 8=8
1<8 1 =8
8+8+8 =24。
欢迎拍砖。