c++ - 为什么cs中地址的值总是偶数?
问题描述
为什么C和C++中地址的值总是偶数?例如:我声明了一个变量 int x 并且 x 的内存地址为 0x6ffe1c(十六进制)。无论。该值永远不是奇数,它始终是偶数。为什么呢??
解决方案
计算机内存由位组成。这些位被组织成组。一台计算机可能有千兆字节的内存,超过 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# - 无法实现 RequestHandler 工作 CefSharp winforms C#
- powershell - 用于操作分隔文本文件的 PowerShell 脚本
- angular - 如何从angular9中的子组件重定向到父路由?
- r - 通过将一个列表扩展到加入列表的长度来将列表连接在一起
- java - java的.asparallel()方法中的'batchsize'是什么
- java - Android 通知重要性无法更改
- xcode - 为什么我的故事板segues纵横交错?
- python-3.x - 如何使用 matplotlib.pyplot 在条形图和数据表之间创建空间?
- android - 安全区的空间可以被任何东西填满吗?
- python - Pyspark SQL 选择列为 NaN 的数据