字节对齐是怎么回事?

  • 内容
  • 评论
  • 相关

由于C语言是一门接近底层硬件的编程语言,它能直接对存储器地址进行访问(当前大部分处理器在操作系统的应用层所访问到的逻辑地址,而部分嵌入式系统由于不含带存储器管理单元,因此可直接访问物理地址)。

在计算机中,所谓“地址”就是用来标识存储单元的一个编号,就好比我们住房的门牌号。没有门牌号,快递就没法发货;如果门牌号记错了,那么快递就会把货物送错地方。

计算机中的地址也是一样,我们为了要访问存储器中特定单元的一个数据,那么我们首先要获悉该数据所在的地址,然后我们通过这个地址来访问它。

访问存储器,我们也简称为“访存”(Memory Access)。访问地址,我们也简称为“寻址”(Addressing)。

一般计算机架构中都会有地址总线和数据总线,CPU 先通过地址总线发送寻址信号,以指定所要访问存储器单元的地址。然后再通过数据总线向该地址读写数据,这样就完成了一次访存操作。这好比于快递送货,我们先打电话告诉快递通信地址,然后快递员把货送到该地址(写数据),或者去该地址拿货(读数据)送到别家。

一般对于 32 位系统来说,处理器一次可访问 1个(8比特)字节、2 个字节或 4 个字节。当访问单个字节时,对 CPU 不做对齐限制;而当访问多个字节时,比如要访问 N 个字节,由于计算机总线设计等诸多因素,要求 CPU 所访问的起始地址满足 N 个字节的倍数来访问存储器。如果在访问存储器时没有按照特定要求做字节对齐,那么可能会引发访存性能问题,甚至直接导致寻址错误而引发异常(引发异常后通常会导致当前应用意外退出,在嵌入式系统中可能就直接死机或复位)。

下面我们给出一张图来描述,看看一般对 32 位系统而言如何正确地做到访存字节对齐。


图:字节对齐

本文标题:字节对齐是怎么回事?

本文地址:https://www.hosteonscn.com/2567.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注