首页 > 解决方案 > 为什么cs中地址的值总是偶数?

问题描述

为什么C和C++中地址的值总是偶数?例如:我声明了一个变量 int x 并且 x 的内存地址为 0x6ffe1c(十六进制)。无论。该值永远不是奇数,它始终是偶数。为什么呢??

标签: c++numbers

解决方案


计算机内存由位组成。这些位被组织成组。一台计算机可能有千兆字节的内存,超过 1,000,000,000 字节或 8,000,000,000 位,但与内存的物理连接不能简单地从该内存中获取任何特定位。

当处理器想要从内存中获取数据时,它会在总线上发出一个信号,请求内存中的一个特定。总线主要是一组连接计算机不同部分的电线。一个内存字是一组特定于该硬件的大小的位,可能是 32 位。当存储设备看到一个字的请求时,它会立即获取这些位并将它们放在总线上。(该总线将有 32 条或更多线,因此它可以一次承载一个字的所有数据。)

让我们继续以 32 位字为例。由于内存被分组为 32 位的字,因此每个字的内存地址是 32 位或四个字节的倍数。每个四的倍数(0、4、8、12、16、……4096、4100、4104……)的地址都是一个字的地址。处理器总是以字为单位读取或写入内存——这是硬件可以做的唯一交互;处理器无法从内存中读取单个字节。如果您int是一个单词,那么处理器可以通过询问该单词从内存中获取它。

另一方面,假设您int从地址 99 开始。那么它的一个字节在从地址 96 开始的字中(地址 96 到 99),它的三个字节在从地址 100 开始的字中(地址 100至 103)。为了得到你的int,处理器必须读取两个字,然后将它们中的字节拼接在一起以形成一个int

首先,这是浪费时间。从内存中读取两次比读取一次需要更长的时间。其次,如果处理器必须有额外的电线和电路来做这件事,它会使处理器更昂贵并且使用更多的能量,并且它会占用处理器可以做的其他事情的资源,比如加法或乘法。

所以处理器被设计成更喜欢对齐的数据。它们可能具有用于处理未对齐数据的组件,但使用这些组件可能需要额外的时间或资源。因此,编译器旨在以更适合目标体系结构的方式对齐对象。


推荐阅读