为什么C和C++中的地址值总是偶数?例如:我声明一个变量 int x 并且 x 的内存地址为 0x6ffe1c (十六进制)。无论。该值永远不是奇数,它始终是偶数。为什么会这样??
计算机内存由位组成。这些位被组织成组。计算机可能有 1 GB 的内存,超过 1,000,000,000 字节或 8,000,000,000 位,但与内存的物理连接不能简单地从该内存获取任何一个特定位。
\n\n当处理器需要内存中的数据时,它会在总线上发出一个信号,请求内存中的特定字。总线主要是一组连接计算机不同部分的电线。内存字是该硬件特有的某种大小的一组位,可能是 32 位。当存储设备看到对一个字的请求时,它会立即获取这些位并将它们放在总线上。(该总线将有 32 条或更多线,因此它可以一次承载一个字的所有数据。)
\n\n让\xe2\x80\x99s 继续32 位字的示例。由于存储器被分组为 32 位的字,因此每个字的存储器地址是 32 位的倍数,即四个字节。每个四的倍数(0, 4, 8, 12, 16, \xe2\x80\xa6 4096, 4100, 4104,\xe2\x80\xa6)的地址都是一个字的地址。处理器总是以字\xe2\x80\x94为单位读取或写入内存,这是硬件可以做的唯一交互;处理器无法从内存中读取单个字节。如果您的int内容是单个单词,那么处理器可以通过询问该单词来从内存中获取它。
另一方面,假设int从地址 99 开始。那么其中一个字节位于从地址 96 开始的字中(地址 96 到 99),其中三个字节位于从地址 100 开始的字中(地址 100至 103)。为了获得您的int,处理器必须读取两个字,然后将它们中的字节拼接在一起以形成一个int。
首先,这是浪费时间。从内存中读取两次比读取一次需要更长的时间。其次,如果处理器必须有额外的电线和电路来执行此操作,则会使处理器更加昂贵并消耗更多能量,并且会占用处理器可以执行的其他操作(例如加法或乘法)的资源。
\n\n因此,处理器被设计为更喜欢对齐的数据。它们可能具有用于处理未对齐数据的组件,但使用这些组件可能需要额外的时间或资源。因此,编译器被设计为以适合目标体系结构的方式对齐对象。
\n| 归档时间: |
|
| 查看次数: |
1285 次 |
| 最近记录: |