码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 内存对齐

时间:2015-10-03 16:47:22      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

内存对齐:

  1、编译器为程序中的每个数据单元安排在合适的位置上,从而导致了相同的变量,不同声明顺序的结构体大小的不同

 

   2、规则:

    (1)、 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。 注意#pragma pack(n) 表示设置为n字节对齐。 VC6默认8字节对齐

 

    (2)、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照min(#pragma pack指定的数值,,结构(或联合)最大数据成员长度)对齐。

 

  3、例子:

    struct Struct1 {
         char a ;
         int  b ;
         short c ;
    };

  Struct1 :char占一个字节,起始偏移为0 ,int 占4个字节,min(#pragma pack()指定的数,这个数据成员的自身长度) = 4(VC6默认8字节对齐),所以 int按4字节对齐,起始偏移必须为4的倍数,所以起始偏移为4,在char后编译器会添加3个字节的额外字节,不存放任意数据。short占2个字节,按2字节对齐, 起始偏移为8,正好是2的倍数,无须添加额外字节。到此规则1的数据成员对齐结束,此时的内存状态为:

    oxxx|oooo|oo

    0123 4567 89 (地址)

    (x表示额外添加的字节)

 

共占10个字节。还要继续进行结构本身的对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行,st1结构中最大数据成员长度为int,占4字节,而默认的#pragma pack 指定的值为8,所以结果本身按照4字节对齐,结构总大小必须为4的倍数,需添加2个额外字节使结构的总大小为12 。此时的内存状态为:

    oxxx|oooo|ooxx

    0123 4567 89ab  (地址)

 

到此内存对齐结束。Struct1 占用了12个字节而非7个字节。

 

  4、内存对齐的主要作用是:

    (1)、 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

    (2)、性能原因:经过内存对齐后,CPU的内存访问速度大大提升。

 

C++ 内存对齐

标签:

原文地址:http://www.cnblogs.com/wmsir/p/4853520.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!