- 对于结构体的各个成员,第一个成员位于偏移为0的位置,以后的每个数据成员的偏移量必须是MIN(字节对齐数,数据成员的长度)的倍数。
- 在所有的数据成员完成各自对齐之后,结构体本身也要进行对齐,对齐将按照MIN(字节对齐数,长度最长的数据成员)进行。
// 设置n字节对齐,Windows默认是8,Linux默认是4 #pragma pack(n)
#includeusing namespace std; struct A { char a; int b; short c; }; struct B { short c; char a; int b; }; int main() { cout << sizeof(A) << endl; // 12 cout << sizeof(B) << endl; // 8 system("pause"); return 0; }
对于结构体A:
- 结构体数据成员的对齐:short占2个字节,起始偏移为零。char占1个字节,min(8,1)=1,则偏移量为2,无需添加任何字节。int占4个字节,min(8,4)=4,所以偏移量是4的倍数,偏移量为4,应该在char后面加上1个字节。
- 结构体本身的对齐:min(8,4)=4,总体应该是4的倍数,偏移量为8,无需添加任何字节。
对于结构体B:
- 结构体数据成员的对齐:char占一个字节,起始偏移为零。int占四个字节,min(8,4)=4,则偏移量为4,应该在char后面加上三个字节,不存放任何东西。short占两个字节,min(8,2)=2,所以偏移量是2的倍数,偏移量为8,无需添加任何字节。
- 结构体本身的对齐:min(8,4)=4,总体应该是4的倍数,还需要添加两个字节在最后面。
- 平台原因:不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
- 硬件原因:CPU在读取内存的时候是一块一块进行读取的,块的大小称为内存读取粒度。访问未对齐的内存,数据先读高位,再读低位,处理器要访问两次内存;访问对齐的内存,处理器只要访问一次。为了提高处理器读取数据的效率,我们使用内存对齐。
参考:https://www.cnblogs.com/jijiji/p/4854581.html



