字节对齐的意义

来源:互联网 发布:华硕黄静事件 知乎 编辑:程序博客网 时间:2024/06/14 22:28

一、为什么需要进行字节对齐
1、各个硬件平台对存储空间的处理不尽相同,比如一些CPU访问特定的变量必须从特定的地址进行读取,所以在这种架构下就必须进行字节对齐了,要不然读取不到数据或者读取到的数据是错误的。
2、会对CPU的存取效率产生影响:比如有些平台CPU从内存中偶数地址开始读取数据,如果数据起始地址正好为偶数,则1个读取周期就可以读出一个int类型的值,而如果数据其实地址为奇数,那我们就需要2个读取周期读出数据,并对高地址和低地址进行拼凑,这在读取效率上显然已经落后了很多了。

二、字节对齐规则
1、数据类型自身对齐值:char类型自身对齐值为1,short对齐值为2,int, float, long对齐值为4,string对齐值为4,double对齐值为8,long double对齐方式为12。
2、指定对齐方式:#pragma pack (value)时指定的对齐value。
3、结构体或者类的对齐方式:其成员中自身对齐值最大的那个值
4、含有指定对齐方式的结构体和类的对齐方式:按照指定对齐方式和结构体或者类成员中自身对齐值最大的那个值。
比如:

#pragma pack (2)struct temp{    static int A;    char B;    double C;    int D;};#pragma pack()          //恢复对齐状态

在此我们指定对齐方式为2,而struct默认对齐方式为4,所以对齐方式取二者中的较小者:2。
并且在此A被static 修饰,为静态变量,其存放位置与结构体或者类的实例无关,所以不对结构体或者类的大小产生任何影响。
在此struct C的大小为14。//sizeof(C) == 14

三、字节对齐的优势
字节对齐可以让CPU快速取到相应的数据,可以提高程序的效率。

原创粉丝点击