Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1244421
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: C/C++

2015-01-08 17:27:42

对齐有如下情况: 

1.      基本类型变量起始地址要按一定规则对齐. 
        char 类型,其起始地址要1字节边界上,即其地址能被1整除(即任意地址即可)
        short类型,其起始地址要2字节边界上,即其地址能被2整除
        int  类型,其起始地址要4字节边界上,即其地址能被4整除
        long类型,其起始地址要4字节边界上,即其地址能被4整除
        float类型,其起始地址要4字节边界上,即其地址能被4整除
        double类型,其起始地址要8字节边界上,即其地址能被8整除  

2.      结构实例起始址要在自己最大尺寸成员的对齐地址上
   如最大尺寸的成员是short,则要基于2对齐 

3.      结构内成员的偏移量也要参照第1条,满足相应倍数 
如成员是short,则偏移量也是2的倍数. 
这一条实际仍然是第1条规则的扩展,因为结构起始地址按最大倍数来,加上内部相应倍数,这样成员绝对地址仍然满足第1条规定 

4.      结构总尺寸也要对齐. 要为最大尺寸的成员的整数倍, 
如果不是则要在结构最后补齐成整数倍

实例 1

例2

例3

对于double类型 在window上和linux 有不同的对齐规则
在window上是8字节对齐

在linux上是四字节对齐


取消字节对齐
    绝大部分编译器是使用预编译指令pragma取消对齐
        #pragma pack (n) 设置对齐宽度为n,它可以是1,2,4,8等等,其中1就表示不进行字节对齐.
        # pragma pack (n)是成片生效的,即在这个指令后面所有结构都会按新的对齐值进行对齐
        # pragma pack() 将上一次# pragma pack (n)的设置取消.恢复为默认值.
    两者是成对使用,在这两者之间所有结构均受到影响 。
    通过#pragma pack(n)来完成生效,但是要注意, 字节对齐值采用n和默认对齐值中较小的一个.换句话说,扩大对齐值是不生效的. 

阅读(2889) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~