内存对齐的细节和编译器实现有关,一般有三个原则:
1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2. 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如果有需要,编译器会在成员之间加上填充字节;
3. 结构体的总大小为结构体中最宽基本类型成员大小的整数倍,如果有需要,编译器会在最末一个成员之后加上填充字节。
ex :
struct st
{
uint16_t id; //2字节宽
uint32_t value; //4字节宽
uint64_t time; //8字节宽
}
内存空间占用情况: 共占用16字节空间宽度
ex :
struct Date
{
char a; //1字节
int b; //4字节
int64_t c; //8字节
char d; //1字节
};
Data data[2][10];
内存空间占用情况: 共占用16字节空间宽度
如果Data首地址为X,则data[1][5].c的地址是X+368.
参考文献:
【1】程序员面试笔试真题与解析