看了一些内存对齐的文章后,自己做的一个小笔记。
内存对齐注意点:
1.确定对齐模数:结构体变量类型,所占字节最多的
2.对齐时,注意存储变量的首地址要能被变量类型所占字节数整除
3.结构体最后的大小要是对齐模数的整数倍
例子1:
struct a
{
char c;
int b;
};
结构体大小为 :1 + 3 + 4 = 8;
由于int 的地址为1,不能被4整除,故c填充3个字节(起始地址为0)
例子2:
struct a
{
int b;
char c;
};
结构体大小为: 4 + 1 +3 = 8;
由于b+c共5个字节,为了能被对齐模数整除,c后面填充3个字节
例:子3:
struct a
{
char b;
short c;
int d;
};
结构体大小:1 + 1 + 2 + 4 = 8;
由于short的地址为1,且sizeof(short) = 2; 不能被2整除,故b后面填充一个地址
例子4:
struct a
{
char b;
char c;
short d;
int e;
};
结构体大小:1 + 1 + 2 +4 =8;
例子5:
struct a
{
char b;
short c;
char d;
int e;
};
结构体大小: 1 + 1 + 2 +1 +3 + 4 = 12
由于c 的地址为1,故b填充1个字节,由于e的地址为5,故d后填充3个字节
例子6:
struct b
{
short c;
struct a d; //a为例子5结构体
};
结构体大小:2 + 2 + 12 =16
由于sizeof(c) = 2;结构体a 的对齐模数是4,且d的地址为2,故c后填充2个字节