浅谈字节对齐

来源:互联网 发布:samba windows 无权限 编辑:程序博客网 时间:2024/05/22 13:10

    知识忘记的速度真的是快,总是感觉自己好像什么都没学过,于是开始复习一下知识,今天复习了一下C语言中的字节对齐。

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

   我对字节对齐的理解是:字节对齐的作用是提高访问效率,不同的平台有不同的数据对齐方式,如果不按照平台要求对数据存放进行对齐,会带来存取效率上的损失。比如32位的Intel处理器通过总线访问(包括读和写)内存数据。每个总线周期从偶地址开始访问32位内存数据,内存数据以字节为单位存放。如果一个32位的数据没有存放在4字节整除的内存地址处,那么处理器就需要2个总线周期对其进行访问,显然访问效率下降很多。

   讨论字节对齐的时候需要注意以下四条规律:

1) 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。

      2) 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。
      3) 指定对齐值:#pragma pack (value)时的指定对齐值value。
      4) 数据成员,结构体和类的有效对齐值:自身对齐值和指定对齐值中较小者,即有效对齐值=min{自身对齐值,当前指定的pack值}。

我们可以根据这四条规则去推敲各种情况下的字节对齐方式,并求出结构体所占的字节数,一般字节对齐在C语言中主要是出现在结构体中,其他的情况比较简单。
我个人认为需要注意的有如下:
1. 不同平台默认的对齐方式不同,Linux下是4,windows下是8
2. 以下两种情况的对比需要注意一下
struct AA{char a;int b;struct {char c;int  d;};double e;};sizeof(AA)struct AA{char a;int b;struct BB{char c;int  d;};double e;};sizeof(AA)


0 0
原创粉丝点击