一:字节对齐 sizeof(struct) 结构体大小 占内存大小
关键点:对齐以地址能整除(内存地址值%类型字节数==0)为准;
1, 默认对齐:
内对齐:(成员对齐)针对结构体内部元素,具体数据存储的起始位置地址 能整除 该类型的字节大小,如int数据可以放在4的整数倍的地址,如果不能整除,则向后移(不是结构体首元素时,
浪费几个地址找到为止)如果含数组等则取元素字节宽度char a[3],占地3字节。
——系统默认4字节为最大,超过取4.long long(8字节)则取4的倍数的地址开始放long long.
如:struct st{
int b;
char f;
char a[3];
}stu;
sizeof(stu)=8;
如:struct st{
int b;
char a[3];
long long c;
}stu;
sizeof(stu)=16;
外对齐:(结构体对齐)按成员类型大小最大的对齐,在结构体尾部,如果地址不能整除最大值,则向后移找到为止。
——系统默认4字节为最大,含有元素类型大于4则取4的倍数的尾地址结尾;若所含元素类型大小都小于4,则取元素中类型的最大值对齐。
2, 按设置参数对齐:
此外可以认为指定对齐方式;
自定义对齐: #pragma pack(x) x:自己定义的字节对齐大小x取1,2,4,8,……
#pragma pack(1)
struct st{
char a[3];
short b;
}stu;
sizeof(stu)=5;
自定义外对齐(地址对齐):
特殊区分开默认对齐和自定义对齐,指定外对齐方式;
struct {} __attribute__((aligned(x))) 变量名;x:表示自定义结构体首地址(或尾地址)能整除x(上述的外地址)。
阅读(1150) | 评论(0) | 转发(2) |