ARM的字对齐问题总结_第1页
ARM的字对齐问题总结_第2页
ARM的字对齐问题总结_第3页
ARM的字对齐问题总结_第4页
ARM的字对齐问题总结_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARMARM 的字对齐问题总结的字对齐问题总结 一 啥是字对齐 为啥要字对齐 一 啥是字对齐 为啥要字对齐 现代计算机中内存空间都是按照 byte 划分的 从理论上讲似乎对任何类 型的变量的访问都可以从任何地址开始 但实际情况是在访问特定类型变量的 时候经常在特定的内存地址访问 这就是对齐 字节对齐的原因大致是如下两条 1 平台原因 移植原因 不是所有的硬件平台都能访问任意地址上的任意数据 的 某些硬件平台只能在某些地址处取某些特定类型的数据 否则抛出硬件异 常 2 性能原因 数据结构 尤其是栈 应该尽可能地在自然边界上对齐 原因在于 为了访问未对齐的内存 处理器需要作两次内存访问 而对齐的内存访问仅需 要一次访问 二 对齐规则二 对齐规则 每个特定平台上的编译器都有自己的默认 对齐系数 也叫对齐模数 程序员可以通过预编译命令 pragma pack n n 1 2 4 8 16来改变这一系数 其中的 n 就是你要指定的 对齐系数 规则 1 数据成员对齐规则 结构 struct 或联合 union 的数据成员 第一个数 据成员放在 offset 为0的地方 以后每个数据成员的对齐按照 pragma pack 指 定的数值和这个数据成员自身长度中 比较小的那个进行 2 结构 或联合 的整体对齐规则 在数据成员完成各自对齐之后 结构 或联 合 本身也要进行对齐 对齐将按照 pragma pack 指定的数值和结构 或联合 最大数据成员长度中 比较小的那个进行 3 结合1 2可推断 第一 如果 n 大于等于该变量所占用的字节数 那么偏移 量必须满足默认的对齐方式 第二 如果 n 小于该变量的类型所占用的字节数 那么偏移量为 n 的倍数 不用满足默认的对齐方式 三 三 X86X86对齐实验对齐实验 下面再简要回顾解释一下上述的对齐规则 结合实例进行分析 1 数据类型自身的对齐值 对于 char 型数据 其自身对齐值为1字节 对于 short 型为2字节 对于 int float double 类型 其自身对齐值为4字节 2 结构体的自身对齐值 其成员中自身对齐值最大的那个值 3 指定对齐值 pragma pack n 来设定变量以 n 字节对齐方式 n 字节对 齐就是说变量存放的起始地址的偏移量有两种情况 第一 如果 n 大于等于该 变量所占用的字节数 那么偏 移量必须满足默认的对齐方式 第二 如果 n 小 于该变量的类型所占用的字节数 那么偏移量为 n 的倍数 不用满足默认的对 齐方式 4 数据成员和结构体的有效对齐值 数据成员 数据类型 和数据结构的自身对 齐值和指定对齐值中小的那个值 数据成员对齐了数据结构自然也就对齐了 了 解上述四个基本概念 我们开始讨论具体数据结构的成员和其自身的对齐方 式 有效对齐值 N 是最终用来决定数据存放地址方式的值 有效对齐 N 就是 表示 对齐 在 N 上 也就是说该数据的 存放起始地址 N 0 而数据结构中 的数据变量都是按定义的先后顺序来排放的 第一个数据变量的起始地址就是 数据结构的起 始地址 结构体的成员变量要对齐排放 结构体本身也要根据自 身的有效对齐值圆整 结构体成员变量占用总长度需要是对结构体有效对齐值的 整数倍 下面结合 VS2005中编译环境的例子进行深入了解 例子 B 分析 struct B char b int a short c 假设 B 从地址空间0 x0000开始排放 该例中没有显式指定对齐值 N VS2005默 认值为4 成员变量 b 自身对齐值是1 比指定或默认指定对齐值4小 故有效对齐值为1 其存放地址0 x0000符合0 x0000 1 0 满足字节对齐原则 成员变量 a 自身对齐值为4 和指定或默认指定对齐值4相等 故有效对齐值也 为4 为了保证字节对齐 成员变量 a 只能存放在起始地址为0 x0004到0 x0007这 四个连续的字节空间中 复核0 x0004 4 0 成员变量 c 自身对齐值为2 比指定或默认指定对齐值4小 故有效对齐值为2 可顺序存放在0 x0008至0 x0009两个字节空间中 符合0 x0008 2 0 至 此满足了数据成员的字节对齐 接着看数据结构 B 的对齐 数据结构 B 的自 身对齐值为其变量中最大对齐值 也就是成员变量 b 4 故结构体 B 的有效对 齐值也是 4 根据结构体圆整的要求 0 x0009到0 x0000 10字节 10 2 4 0 所以0 x0000A 到0 x000B 也为结构体 B 所占用 故 B 从0 x0000到0 x000B 共 有12个字节 sizeof struct B 12 之所以在变量 C 补充2字节 是因为要实现编译器快速有效的存取结构数组 试 想如果定 义 B 结构数组 第一个结构起始地址是0没有问题 但是第二个结构呢 按照数组的定义 数组中所有元素都是紧挨着的 如果不把结构的大小补充为对 齐值 4 的整数倍 那下一个结构的起始地址将是0 x0000A 这显然不能满足结 构的地址对齐了 例子 C 分析 指定按2字节对齐 align 2 struct C char b int a short c 取消指定对齐 恢复缺省对齐 同理 例子 C 中成员变量 b 自身对齐值为1 指定对齐值为2 故效对齐值为 1 假设 C 从0 x0000开始 那么 b 存放在0 x0000 符合0 x0000 1 0 满足字节 对齐原则 成员变量 a 自身对齐值为4 指定对齐值为2 故有效对齐值为2 顺序存放 在0 x0002 0 x0003 0 x0004 0 x0005四个连续字节中 符合0 x0002 2 0 满足 字节对齐原则 成员变量 c 的自身对齐值为2 与指定对齐值相等 故有效对齐值为2 顺序 存放在0 x0006 0 x0007中 符合 0 x0006 2 0 满足字节对齐原则 从0 x0000到0 x00007共八字节存放的是结构体 C 的变量 结构体 C 自身对齐 值为4 比指定对齐值2大 故 C 的有效对齐值为2 因8 2 0 C 只占用0 x0000到 0 x0007的八个字节 所以 sizeof struct C 8 完全满足字节对齐原则 除了指定的对齐值不同能导致数据结构的地址存放不同外 编译器不同存 放结构体方式也可能不同 四 四 ARMARM 平台的对齐问题平台的对齐问题 在 ARM 中 有 ARM 和 Thumb 两种指令 ARM 指令 每执行一条指令 PC 的值加4个字节 32bits 一次访问4字节内容 该字节的起始地址必须是4字节对齐的位置上 即地址的低两位为 bits 0b00 也就是说地址必须是4的倍数 Thumb 指令 每执行一条指令 PC 的值加2个字节 16bits 一次访问2字 节内容 该字节的起始地址必须是2字节对齐的位置上 即地址的低两位为 bits 0b0 也就是说地址必须是2的倍数 遵循以上方式叫对齐 alignedaligned 方式 不遵守这样方式称为非对齐 unalignedunaligned 的存储访问操作 五 五 ARMARM 平台字节对齐关键字平台字节对齐关键字 1 align num 用于修改最高级别对象的字节边界 A 在汇编中使用 LDRD 或者 STRD 时 就用到此命令 align 8 进行修饰限制 来保证数据对象是相应对齐 B 该修饰对象的命令最大是8个字节限制 可让2字节的对象进行4字节 对齐 但是不能让4字节的对象2字节对齐 C align 是存储类修改 他只修饰最高级类型对象不能用于结构或者函数对 象 2 packed packed 是进行一字节对齐 A 不能对 packed 的对象进行对齐 B 所有对象的读写访问都进行非对齐访问 C float 及包含 float 的结构联合及未用 packed 的对象将不能字节对齐 D packed 对局部整形变量无影响 D 强制由 unpacked 对象向 packed 对象转化是未定义 整形指针可以合法定 义为 packed packed int p packed int 则没有意义 3 unaligned 用于修饰该变量可按照非对齐访问 六 如何查找与字节对齐方面的问题六 如何查找与字节对齐方面的问题如果出现对齐或者赋值问题首先查看 1 编译器的 big little 端设置 2 看这种体系本身是否支持非对齐访问 3 如果支持看设置了对齐与否 如果没有则看访问时需要加某些特殊的修饰来 标志其特殊访问操作 七 结论七 结论 针对于32位处理器对于本地使用的数据结构 为提高内存访问效率 采用四 字节对齐方式 同时为了减少内存的开销 合理安排结构成员的位置 减少四 字节对齐导致的成员之间的空隙 降低内存开销 对于处理器之间的数据结构 需要保证消息的长度不因为在不同编译平台和 不同处理器导致消息结构的长度发生变化 使用一字节对齐方式对消息结构进 行紧缩 为保证处理器之间的消息的数据结构的内存访问效率 采用字节填充 的方式自己对消息

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论