为什么C和C++中地址的值总是偶数? 例如:我声明了一个变量 int x,x 的内存地址为 0x6ffe1c(十六进制)。无论。该值永远不是奇数,它始终是偶数。为什么会这样??
最佳答案
计算机内存由位组成。这些位被组织成组。一台计算机可能有 1 GB 的内存,超过 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
。
首先,这是浪费时间。从内存中读取两次比读取一次花费的时间更长。其次,如果处理器必须有额外的线路和电路来执行此操作,它会使处理器更昂贵并使用更多的能量,并且它会占用处理器可以做的其他事情的资源,例如加法或乘法。
所以处理器被设计成更喜欢对齐的数据。它们可能具有用于处理未对齐数据的组件,但使用这些组件可能需要额外的时间或资源。因此,编译器旨在以适合目标体系结构的方式对齐对象。
关于c++ - 为什么 c 中地址的值总是偶数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58380087/