c语言字节对齐

  • 什么是字节对齐

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

基本数据类型自身对齐,也叫自然对齐。就是说数据的存储地址可以被其自身字节长度整除。例如float型的数据存储地址必须为4的整数倍。

  • 为什么需要字节对齐
原因有两点 : 微笑各个硬件平台对 存储空间的处理上有很大的不同,一些平台对某些特定类型的数据只能从某些特定地址开始存取,否则将会引发错误; 微笑如果不按照其平台的要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。

  • 字节对齐的方式与原则

方式:字节的对齐方式和处理器位数以及编译器选项有关,一般对于32位机,在vc中默认是4字节对齐的,GNU gcc 也是默认4字节对齐。

也可以通过一些配置,指令,关键字来修改字节对齐方式。

微笑在VC IDE中,可以这样修改:[Project]|[Settings],c/c++选项卡Category的Code Generation选项的Struct Member Alignment中修改,默认是8字节。

微笑使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。#pragma pack (),取消自定义字节对齐方式。

微笑__attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。__attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。


原则:   结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

  • 实例分析

见引用链接:http://blog.csdn.net/21aspnet/article/details/6729724

  • 易错点

当计算结构体总体大小时,容易忽略填充,以使总体大小为最宽基本类型成员大小的整数倍。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值