为什么要对齐
- 32位架构的cpu,4个字节为一个读周期,设4字节变量在内存首地址为addr
- addr出现在4的整数倍地址处,方便一个读周期读取
- 若跨越2个周期拼凑一个4字节,效率低
对齐值
- 自身对齐值
- 整数类型自身的对齐值:内置类型自己的尺寸
- 结构体自身对齐值:数据成员最大的那个自身对齐值
- 指定对齐值:程序员指定的那个值,不同平台指定的方式:
// vs
#progma pack(8) // 指定为8字节,32位系统默认为4字节
此时再定义结构体,此结构体的对齐值就是8字节
#pragma pack() // 取消指定
// linux
typedef struct student{}__attribute__((packed)) student;
- 有效对齐值:自身对齐值与指定对齐值中较小的那个
结构体对齐要求
- addr为结构体的对齐起始地址:
addr%有效对齐值==0
- 每个数据成员x都要对齐addr:
addr%x有效值==0
- 结构体自身也要对齐addr:
addr%st有交值==0
- 若无法整除,则addr递增,直接可以整除所有成员及结构体变量本身为止
- 每个数据成员x都要对齐addr:
typedef struct student // C与C++结构体,C++中的类,都可以部分初始化
{ // id:指定4 自身4 有效4 地址:00-03
int id;
// name:指定4 自身7 有效4 地址:04-11,其中10-11补足1字节
char name[7];
// sa:指定4 自身2 有效2 地址:12-15,其中14-15补足2字节
short sa;
struct
{
// month:指定4 自身4 有效4 地址:16-19
int month;
// ch1:指定4 自身1 有效1 地址:20-23,其中21-23补足3字节
char ch1;
// L:指定4 自身8 有效4 地址:24-32
long long L;
}date; //结构体本身 指定4 自身16 有效4
}student; // sizeof(student)==32
// 当系统默认的为4,当指定为8时,其结果一样,因为8是读周期4字节的倍数
// 当指定对齐值为2字节时,为28字节,主要少了sa补足的2字节,ch1只需补1字节,省了2字节
// 当指定对齐值为1字节时,为26字节,全不需要补足。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人