守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 2080|回复: 0

[C语言] 浅析为何要内存对齐

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52619
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-4 13:46:24 | 显示全部楼层 |阅读模式

    在分析内存对其之前,先简要简要介绍一下ARM处理器是如何进行数据操作的:

         ARM是32位处理器,armv4能高效的处理8,16,32位的数据,但是大多数arm处理器直接操作的是32位的数据。

    地址跳变基数为4字节即4.一次存取数据量为32位。(硬件角度),我们一次取到的32位数据不一定是一个完整

    的数据构,可能是两个数据结构,也可能是某个数据结构的一部分,(而编译器帮助我们将一条对数据结构操作

    的C操作转化成多条对齐的汇编指令,这些从每次取到的32位数据中获得有用的值,合并重组而完成对一个数据结构的操作)

    当对一个数据结构进行操作时,如边界不对齐,编译器可以将C操作转化成多条边界对齐的汇编操作,把结果合并、

    重组来模拟对齐的操作(可见这种非对齐的存储是非常消耗效率的)。

    软件角度,在软件方面我们定义的数据排列方式是由编译器决定的,根据编译器的对称规则进行数据排列,而常用的

    数据操作指令(ARM指令中的)是以4字节为对称边界进行操作的。C中允许你干预“内存对齐”。

    上面已经提到了,内存对齐对处理器效率的影响,而我们关注内存对齐不外乎下面两大原因:

         1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取

    某些特定类型的数据,否则抛出硬件异常。(平台移植是驱动程序开发者经常需要考虑的问题)。


          2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要

    作两次内存访问;而对齐的内存访问仅需要一次访问。(就是刚才所提到的对效率的影响)。

         下面简要说明下内存对齐对高质量可移植代码的重要性:

         在arm处理器中如果装载和存储的地址与数据类型的边界不对齐,那么可能产生异常的结果,例如:通常C编译器假定

    指针是边界对齐的。如果指针不是边界对齐,那么程序执行会产生不正确的结果。这样,把代码从允许边界不对齐的

    处理器移植到ARM处理器时就会出现问题。

    最后再提一下对齐规则:

    对齐规则


      每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#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值的大小将不产生任何效果。


    本文来自:http://blog.csdn.net/liukun321/article/details/6974206


    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2024-3-28 18:44 , Processed in 0.047405 second(s), 31 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表