在对结构体或者类进行 sizeof 的时候,其涉及到内存对齐的相关规则。了解内存对齐的规则,我们便可以通过指针去访问类或结构体中的成员(对于我们理解结构体和类的内存布局以及指针的用法有极大好处)。
先来看一个例子:
typedef struct {
int a;
double c;
short b;
}S_A;
typedef struct {
int a;
short b;
double c;
}S_B;
sizeof(S_A) = ? sizeof(S_B) = ? 想一想这个问题?
答案是sizeof(S_A) = 24, sizeof(S_B) = 16。这是非常简单的一个例子,体现了结构体的内存对齐规则。
在结构体中,从结构体的首地址开始,定义偏移量0。
对于结构体S_B,a的偏移量为0,占4个字节(0 - 3),b的偏移量为4,占2个字节(4 - 5),c的偏移量为8,占8个字节(8 - 15)。
对于结构体S_A,a的偏移量为0,占4个字节(0 - 3),c的偏移量为8,占8个字节(8 - 15),b的偏移量为16,占2个字节(16 - 17)。
这就是内存对齐,对齐规则是按照成员的声明顺序,依次安排内存,其偏移量为成员大小的整数倍,0看做任何成员的整数倍,最后结构体的大小为最大成员的整数倍(所以这里的S_A的大小是24,而不是18