概念:是一个数据类型所能存放的内存地址的属性又称字节对齐。如一个数据类型的内存对齐为8时,这个数据类型所定义出来的所有变量其内存地址都是8的倍数。
自然对齐:对齐属性和数据类型的大小相等,如4字节大小的int型数据默认它的字节对齐也是4。
目的:内存对齐可以提高CPU读取内存的效率。(32位的x86 CPU,一个时钟周期可以读取4个连续的内存单元,即4字节),如一个int放在奇数内存位置上,想把这4个字节读出来,32位CPU就需要两次,但对齐之后一次就可以了。
对齐方式
对于结构体来说,默认的对齐将等于其中对齐最大的成员的对齐值。
测试
#include <iostream>
using namespace std;
struct ts
{
char a; // 1 byte
int b; // 4 bytes
short c; // 2 bytes
long long d; // 8 bytes
char e; // 1 byte
};
int main(int argc, char *argv[])
{
cout << sizeof(ts) << endl;//32
return 0;
}
64 位机,可以按8字节对齐
32 位机,在gcc + 32位linux中,大小超过4字节的基本类型仍然按4字节对齐
对齐原则
数据成员对齐原则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储)
收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
点赞