首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPU和数据对齐

CPU和数据对齐
EN

Stack Overflow用户
提问于 2010-06-11 18:06:57
回答 6查看 9.3K关注 0票数 18

请原谅我,如果您觉得这个问题已经回答了无数次,但我需要回答以下问题!

  1. 为什么数据必须对齐(2字节/4字节/8字节边界)?我怀疑CPU何时有地址线Ax Ax-1 Ax-2 .因此,A2 A1 A0很有可能顺序地处理内存位置。那么,为什么需要在特定的边界对齐数据呢?
  2. 如何在编译代码和生成可执行文件时找到对齐需求?
  3. 例如,如果数据对齐为4字节边界,这是否意味着每个连续字节位于模4偏移处?我怀疑如果数据是4字节对齐的,这是否意味着如果一个字节是1004,那么下一个字节是1008 (或者1005)?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-11 18:21:04

CPU是面向单词的,而不是面向字节的。在简单的CPU中,内存通常被配置为每个地址选通返回一个字(32位、64位等),其中下两个(或更多)地址行通常不关心位。

Intel CPU可以对许多指令在非字赏金上执行访问,但是由于CPU内部执行两个内存访问和一个数学操作来加载一个字,因此会造成性能损失。如果您正在进行字节读取,则不应用对齐。

一些CPU (ARM或Intel SSE指令)需要对齐内存,在进行非对齐访问(或抛出异常)时具有未定义的操作。它们没有实现更为复杂的负载/存储子系统,从而节省了大量的硅空间。

对齐取决于CPU字大小(16、32、64位)或SSE的SSE寄存器大小(128位)。

对于最后一个问题,如果您一次加载一个数据字节,那么大多数CPU上没有对齐限制(有些DSP没有字节级指令,但很可能不会遇到一个)。

票数 17
EN

Stack Overflow用户

发布于 2010-06-11 18:22:00

很少有数据“必须”对齐。更多的是,某些类型的数据可能执行得更好,或者某些cpu操作需要某种数据对齐。

首先,假设一次读取4个字节的数据。我们还可以说,您的CPU有32位数据总线。我们还假设您的数据存储在系统内存中的字节2。

现在,由于您可以一次加载4个字节的数据,让您的地址寄存器指向一个字节没有多大意义。通过使您的地址寄存器指向每4个字节,您可以操作4倍的数据。换句话说,您的CPU可能只能读取以字节0、4、8、12、16等字节开始的数据。

这就是问题所在。如果您希望数据从字节2开始,并且正在读取4个字节,那么一半的数据将位于地址位置0,另一半位于位置1。

因此,基本上,您将以两次命中内存来读取一个4字节的数据元素。有些CPU不支持这种操作(或者强迫您手动加载和组合这两个结果)。

有关更多详细信息,请访问此处:对齐

票数 7
EN

Stack Overflow用户

发布于 2010-06-11 18:18:21

一般来说,所有这三个问题的答案都是“这取决于你的系统”。更多细节:

  1. 您的内存系统可能不是字节可寻址的。此外,让处理器访问未对齐的数据可能会导致性能损失。有些处理器(比如旧的ARM芯片)根本做不到。
  2. 阅读您的处理器的手册和您的代码生成的任何ABI规范,
  3. 通常,当人们提到数据处于某种对齐状态时,它仅指第一个字节。所以,如果ABI规范说“数据结构X必须是4字节对齐的”,那就意味着X应该放在一个可以被4整除的地址上。 就您的具体示例而言,如果数据是从地址1004开始的4字节对齐,那么下一个字节将是1005。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3025125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档