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