返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 ARM 内存对齐总结
 笔记本显卡天梯图2020 笔记本…
 4090显卡怎么配电脑
 英特尔开启AI PC时代!酷睿U…
 十大热门台式机电源排行榜 精…
 台式机电脑电源:如何选择合…
 【2023年618sfx电源推荐】电…
 不能用于笔记本电脑的25寸硬…
 新硬盘第一次使用怎么装系统
 雷霆疾速快如闪电!疾霆Pro固…
 历年国考热门专业有哪些
 计算机组装与维护实训室解决…
 计算机协会:开展青春大讲堂…
 CPU占用过高怎么办 CPU占用过…
 教你笔记本电脑开机cpu使用率…
 解决Windows系统电脑CPU占用…
 机械师(MACHENIKE)显示器 …
 OPPO Find X7系列海报、影像…
 三星新款G95C显示器上架:49…
 电脑开机报警怎么办 电脑开机…
 电脑出现报警声怎么办?电脑…
 计算机主机报警声大全
 渠道销售
 一位前基金渠道销售的职场回…
 外贸行业中的多渠道销售:优…
 outofmemory是什么意思
 怀旧老照片 细数计算机内存的…
 什么是安装内存
 永别了千元卡!曝英伟达明年…
 显卡排行天梯图在线查询 新版…
 购128台服务器!“景观设计第…
 百科|国内电压等级划分及全…
 RTX 4070 Ti电源线VHPWR
 电脑电源各路电压值电脑电源…
 电脑硬盘怎么区分固态和机械
 u盘病毒removabledisk危险吗…
 ufs是什么_ufs是什么意思
 自己提前学习一下相关的知识…
 去电脑维修店修电脑需要注意…
 电脑总线接口的常见故障及其…
 电脑风扇转速慢(cpu风扇转速…
 电脑CPU风扇转速太快怎么办c…
 定位高帅富!BMW推出高端超炫…
 全新 清华紫光 或 现代 15寸…
 清华紫光电脑显示器怎么调整…
 THE policy
 AMD总裁梅德克:和解换来英特…
 买主板送处理器和显卡!尔英…
 微星混插显卡主板详尽规格、…
 新媒体时代下传统文化的传承…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
ARM 内存对齐总结
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/12/19 2:07:22 | 【字体:

  泰勒加尔文将订婚现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问都可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就是对齐。

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

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

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

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

  即各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的整数倍。

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

  3. 结合1、2可推断:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。

  1. 数据类型自身的对齐值:对于char型数据,其自身对齐值为1字节,对于short型为2字节,对于

  3. 指定对齐值: #pragmapack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始

  地址的偏移量有两种情况,第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。

  4. 数据成员和结构体的有效对齐值:数据成员(数据类型)和数据结构的自身对齐值和指定对齐值中小的那个值,数据成员对齐了数据结构自然也就对齐了。

  了解上述四个基本概念,我们开始讨论具体数据结构的成员和其自身的对齐方式。有效对齐值N是最终用来决定数据存放地址方式的值。有效对齐N,就是表示“对齐在N上”,也就是说该数据的存放起始地址%N=0。而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐排放,结构体本身也要根据自身的有效对齐值圆整(结构体成员变量占用总长度需要是对结构体有效对齐值的整数倍)。下面结合VS2005中编译环境的例子进行深入了解:

  假设B从地址空间0x0000开始排放。该例中没有显式指定对齐值N,VS2005默认值为4。

  成员变量b自身对齐值是1,比指定或默认指定对齐值4小,故有效对齐值为1,其存放地址0x0000符合0x0000%1=0,满足字节对齐原则。

  成员变量a自身对齐值为4,和指定或默认指定对齐值4相等,故有效对齐值也为4,为了保证字节对齐,成员变量a只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中,复核0x0004%4=0。

  成员变量c自身对齐值为2,比指定或默认指定对齐值4小,故有效对齐值为2,可顺序存放在0x0008至0x0009两个字节空间中,符合0x0008%2=0。

  至此满足了数据成员的字节对齐,接着看数据结构B的对齐。数据结构B的自身对齐值为其变量中最大对齐值(也就是成员变量b)4,故结构体B的有效对齐值也是4。根据结构体圆整的要求, 0x0009到0x0000=10字节,(10+2)%4=0。所以0x0000A到0x000B也为结构体B所占用。故B从0x0000到0x000B 共有12个字节,sizeof(struct B)=12。

  之所以在变量C补充2字节,是因为要实现编译器快速有效的存取结构数组,试想如果定义B结构数组,第一个结构起始地址是0没有问题,但是第二个结构呢?按照数组的定义,数组中所有元素都是紧挨着的,如果不把结构的大小补充为对齐值(4)的整数倍,那下一个结构的起始地址将是0x0000A,这显然不能满足结构的地址对齐了。

  同理,例子C中成员变量b自身对齐值为1,指定对齐值为2,故效对齐值为1,假设C从0x0000开始,那么b存放在0x0000,符合0x0000%1= 0,满足字节对齐原则。

  成员变量a自身对齐值为4,指定对齐值为2,故有效对齐值为2,顺序存放在0x0002、0x0003、0x0004、0x0005四个连续字节中,符合0x0002%2=0,满足字节对齐原则。

  成员变量c的自身对齐值为2,与指定对齐值相等,故有效对齐值为2,顺序存放在0x0006、0x0007中,符合 0x0006%2=0,满足字节对齐原则。

  从0x0000到0x00007共八字节存放的是结构体C的变量。结构体C自身对齐值为4,比指定对齐值2大,故C的有效对齐值为2,因8%2=0,C只占用0x0000到0x0007的八个字节。所以sizeof(struct C)=8,完全满足字节对齐原则。除了指定的对齐值不同能导致数据结构的地址存放不同外, 编译器不同存放结构体方式也可能不同。

  ARM指令:每执行一条指令,PC的值加4个字节(32bits).一次访问4字节内容,该字节的起始地址必须是4字节对齐的位置上,即地址的低两位为bits[0b00],也就是说地址必须是4的倍数。

  Thumb指令:每执行一条指令,PC的值加2个字节(16bits).).一次访问2字节内容,该字节的起始地址必须是2字节对齐的位置上,即地址的低两位为bits[0b0],也就是说地址必须是2的倍数。

  遵循以上方式叫对齐(aligned)方式,不遵守这样方式称为非对齐(unaligned)的存储访问操作。

  A、在汇编中使用LDRD或者STRD时,就用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。

  B、该修饰对象的命令最大是8个字节限制,可让2字节的对象按4字节对齐,但不能让4字节的对象2字节对齐。

  C、 __align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。

  C、float及包含float的结构联合及未用__packed的对象将不能字节对齐;

  E、强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定义为:

  3. 如果支持看设置了对齐与否,如果没有则看访问时需要加某些特殊的修饰来标志其特殊访问操作。

  针对于32位处理器对于本地使用的数据结构,为提高内存访问效率,采用四字节对齐方式;同时为了减少内存的开销,合理安排结构成员的位置,减少四字节对齐导致的成员之间的空隙,降低内存开销。

  对于处理器之间的数据结构,需要保证消息的长度不因为在不同编译平台和不同处理器导致消息结构的长度发生变化,使用一字节对齐方式对消息结构进行紧缩;为保证处理器之间的消息的数据结构的内存访问效率,采用字节填充的方式自己对消息中成员进行四字节对齐。

  数据结构的成员位置要兼顾成员之间的关系、数据访问效率和空间利用率。顺序安排的原则是:四字节的放在最前面,两字节的紧接最后一个四字节成员,一字节紧接最后一个两字节成员,填充字节放在最后。举例如下:

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 ARM 内存对齐总结 (12-19)
    普通电脑内存 outofmemory是什么意思 (12-18)
    普通电脑内存 怀旧老照片 细数计算机内存的那些事 (12-18)
    普通电脑内存 什么是安装内存 (12-18)
    普通电脑内存 电脑开机蓝屏出现英文 (12-17)
    普通电脑内存 一文读懂:到底什么是Chiplets? (12-17)
    普通电脑内存 电脑插上新内存条显示英文怎么回事 (12-17)
    普通电脑内存 中国知名的数字化人才学习平台和技术社区 (12-16)
    普通电脑内存 面市时间 (12-16)
    普通电脑内存 翻译 每个程序员都应该了解的虚拟内存知识 - … (12-16)
    普通电脑内存 大摩:明年内存芯片市场不是“好”而是“大好… (12-15)
    普通电脑内存 全新笔记本内存标准发布!比 SO-DIMM 薄 57%! (12-15)
    普通电脑内存 《群星Nexus》内存大小 (12-15)
    普通电脑内存 剪映导出失败怎么回事?剪映导出失败原因分享 (12-14)
    普通电脑内存 苹果iPhone14运行内存是多少 苹果支持哪些视频… (12-14)
    普通电脑内存 苹果iPhone14能扩内存吗 苹果 Pro可以拍摄什么… (12-14)
    普通电脑内存 计算机中存储容量的基本单位是字节它的英文名… (12-11)
    普通电脑内存 高频内存至关重要 实测内存对CPU性能的影响 (12-11)
    普通电脑内存 ram是什么意思 是显卡 还是内存 (12-11)
    普通电脑内存 一篇文章教会你选闪存和内存你也可以是数码大… (12-10)