结构体与内存对齐

三结构体
1.结构体是一种自定义类型
原生类型 自定义类型
2.结构体使用时先定义结构体类型再定义变量
或者同时定义
struct student{};struct student s1;
struct student{} s1;
typedef struct student{} s1; s1 s;
3.结构体从数组进步而来
数组有两个明显的缺陷:固定长度 类型相同
4.结构体访问方式
使用->或者 . C语言规定用结构体变量访问使用 . 点号 使用结构体指针使用->访问
访问实质还是使用指针来访问


结构体对齐访问
为什么要对齐访问 :主要是为了配合硬件 硬件本身存在物理限制
如果内存按照4个字节读取读取效率最高
对齐访问用空间换时间




整个结构体整体的大小必须是8的倍数 
结构题每个元素都必须满足自己自身的对齐
在满足上面两条条件按内存最小对齐
对齐位置有前后两个元素共同影响 前一个元素影响开始地址 后一个元素影响结束地址
如struct s{
int a;
char b;
short c;
};
a的起始位置为4的倍数,且停止位置为4的倍数,则b可以直接按a的停止位置为起始位置,结束位置受c影响,c占2个自己,则c的起始位置要是2的倍数,则b需要一个位来对齐,则b占两个字节,此时c的起始位置为b的结束位置+一位补充,结束位置需要按照结构体整体为4的倍数


内存对齐指令#pragma pack()#pragma pack(n) (n=1/2/4/8)
32位编译器,默认对齐方式为4字节对齐
#pragma用来设置编码器的对齐方式
#pragma pack() 设置编译器1字节对齐 
#pragma pack(n) (n=1/2/4/8)设置编译器n字节对齐
以#pragma pack(n)开头以#pragma pack() 结尾 在这两语句中间的以n字节对齐


struct s{
int a;
char b;
short c;
}__attribute__((packet)); __attribute__((packet)) 设置编译器1字节对齐 


struct s{
int a;
char b;
short c;
}__attribute__((aligned(n))); __attribute__((aligned(n))) 让结构体整体按n对齐 不是各个元素按n对齐
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章