内存对齐———结构体

来源:互联网 发布:java面向对象程序设计 编辑:程序博客网 时间:2024/05/20 04:14

对齐准则:

  • 1) 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。
  • 2) 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。
  • 3) 指定对齐值:#pragma pack (value)时的指定对齐值value。
  • 4) 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小者,即有效对齐值=min{自身对齐值,当前指定的pack值}。
    其中,有效对齐值N是最终用来决定数据存放地址方式的值。有效对齐N表示“对齐在N上”,即该数据的“存放起始地址%N=0”。而数据结构中的数据变量都是按定义的先后顺序存放。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐存放,结构体本身也要根据自身的有效对齐值圆整(即结构体成员变量占用总长度为结构体有效对齐值的整数倍)。

结构体字节对齐的细节和具体编译器实现相关,但一般而言满足三个准则:

 1) 结构体变量首地址能够被其最宽基本类型成员的大小所整除; 2) 结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字(internal adding); 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节{trailing padding}。
0 0
原创粉丝点击