当前位置 : 主页 > 编程语言 > c++ >

CPU和数据对齐

来源:互联网 收集:自由互联 发布时间:2021-06-23
请原谅我,如果你觉得这已被无数次回答,但我需要回答以下问题! 为什么数据必须对齐(在2字节/ 4字节/ 8字节边界上)?这里我怀疑的是当CPU具有地址线Ax Ax-1 Ax-2 … A2 A1 A0时,很可能顺序
请原谅我,如果你觉得这已被无数次回答,但我需要回答以下问题!

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

CPU是面向字的,而不是面向字节的.在简单的CPU中,存储器通常被配置为每个地址选通返回一个字(32位,64位等),其中底部的两个(或更多)地址线通常是无关位.

对于许多指令,Intel CPU可以对非字边界执行访问,但是由于内部CPU执行两次存储器访问和一个数学运算来加载一个字,因此存在性能损失.如果您正在执行字节读取,则不应用对齐.

某些CPU(ARM或Intel SSE指令)需要对齐的内存,并且在进行未对齐访问(或抛出异常)时具有未定义的操作.它们通过不实现更复杂的加载/存储子系统来节省大量的硅空间.

对齐取决于CPU字大小(16,32,64位),或者在SSE的情况下取决于SSE寄存器大小(128位).

对于您的上一个问题,如果您一次只加载一个数据字节,则大多数CPU都没有对齐限制(某些DSP没有字节级指令,但可能您不会遇到一个).

网友评论