C/C++中align的问题

本文探讨了C/C++编程中数据对齐(align)的重要性,CPU访问效率与Unaligned数据处理的不同方式,以及在多平台开发中的注意事项。通过VC++的实例展示了如何在结构体中进行内存布局调整,包括padding的影响,帮助理解结构体大小计算和指针解引用时可能出现的意外结果。
摘要由CSDN通过智能技术生成

在C/C++编程中,有一个align的问题经常被忽略。所谓align的问题,就是指通过对原始数据类型按边界对齐,CPU可以达到更好的访问效率。align的基本原则是,数据类型以本身的size作为边界对齐。比如,char按1byte对齐,short按2byte对齐,int按4byte对齐等等。

在定义structure,union,class的时候,需要考虑到这个align的问题。如果访问了Unaligned的数据,不同的CPU和不同的OS会有不同的处理,在多平台开发中尤其要注意这个问题。

x86对Unaligned的数据的访问进行了处理,然而对性能有影响。一些RISC类型的CPU在对Unaligned的数据进行访问的时候,会发生非正常中断的现象,一些RISC类型的CPU会发出一个异常给OS,由OS决定是否处理。

概括来说,对Unaligned的数据的访问,有下面四种情况:
1,CPU以性能为代价,对Unaligned的数据的访问进行处理。
2,CPU抛出异常给OS,OS对Unaligned的数据的访问进行处理。
3,CPU抛出异常没有被OS处理,这样会产生非正常中断等严重的问题产生。
4,编译器对Unaligned的数据的访问进行处理,同样必须以性能为代价。

对于编译器对Unaligned的数据进行处理,为了达到align的目的,自动加入了pading的数据。这时候需要注意这些pading的数据,尤其是使用指针的时候,通常会得到一些预料之外的结果。

下面是一个在VC++下的例子:

=======

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值