深入阐述字节对齐的概念
什么是字节对齐的概念
现代计算机中内存空间都是按照byte划分的,从理论上来说似乎任何类型的变量的访问可以从任何地址开始,但实际情况中是在访问特定类型变量的时候在特定内存地址访问的,这就需要各种类型按照一定规则
在空间上排序,而不是顺序的一个接一个的对齐。
为什么要字节对齐
各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐,常见的是如果不按照适合平台要求对数据进行存放对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始地方,那么一个读周期就可以读出32bit,而如果存放在奇地址开始的地方,就需要2个周期,并对每次读取的结果的高低字节进行拼凑才能得到该32bit数据。
字节对齐的准则
1.结构体变量的地址能够被最宽基本类型成员的大小所整除。
2.结构体每个成员相对于结构体首地址的偏移量都是成员大小端额整数倍。
3.结构体的总大小为结构体最宽基本类型成员大小的整数倍。
栗子4、怎么计算含有指定对齐值的结构体的大小
我们可以通过#pragma pack (value)来指定我们想要的对齐值,结构体真正的对齐值是我们指定对齐值和结构体本身对齐值较小的一个
#pragma pack(4)
struct A
{
int a;
double b;
char c;
};
我们已经在栗子1中见过这个结构体,这个结构体的对齐值是其自身最大的基本类型成员,也就是b,大小为8,可我们指定的对齐的大小为4,所以这个结构的有效对齐值为4
a应该放在偏移为0的地方,0是4的0倍,b应该放在偏移为4的地方,8是4的2倍,c应该放在偏移为12的地方,12是1的12倍,现在,结构体的大小为13,比13大的4的倍数为16,所以整个结构体的大小16
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具