字节对齐问题

文章作者 100test 发表时间 2011:03:18 20:31:54
来源 100Test.Com百考试题网


导读:每个特定平台上的编译器都有自己的默认“对齐系数” ( 也叫对齐模数 ) 。程序员可以通过预编译命令 #pragma pack(n),n=1,2,4,8,16 来改变这一系数,其中的 n 就是你要指定的“对齐系数”。

  规则:

  1 、数据成员对齐规则:结构 (struct)( 或联合 (union)) 的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员的对齐按照 #pragma pack 指定的数值和这个数据成员自身长度中,比较小的那个进行。

  2 、结构 ( 或联合 ) 的整体对齐规则:在数据成员完成各自对齐之后,结构 ( 或联合 ) 本身也要进行对齐,对齐将按照 #pragma pack 指定的数值和结构 ( 或联合 ) 最大数据成员长度中,比较小的那个进行。

  3 、结合 1 、 2 可推断:当 #pragma pack 的 n 值等于或超过所有数据成员长度的时候,这个 n 值的大小将不产生任何效果。 使用指令#pragma pack (n),编译器将按照 n个字节对齐。使用指令#pragma pack (),编译器将取消自定义字节对齐方式。在#pragma pack (n)和#pragma pack ()之间的代码按 n个字节对齐。

  struct s1

  {

  int a.

  char b.

  short e.

  int c.

  }.

  struct s2

  {

  int a.

  char b.

  int c.

  short e.

  int d.

  }.

  1字节对齐 为 11 和 15

  2字节对齐 为 11 和 16

  4字节对齐 为 12 和 20

  8字节对齐 为 12 和 20

  16字节对齐 为 12 和 20


相关文章


位域具体存放数值测试
从STL中学习泛型编程
从sockaddr中取得Ip地址和端口号
随机函数rand()的猜数字游戏
字节对齐问题
MFC中Silder控件及定时函数SetTimer的用法
全排列生成算法:next_permutation
最长公共子序列
2011年计算机二级C 考试备考冲刺攻略
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛