【问题标题】:Do 64 Bit architectures memory addresses still hold 1 byte64 位架构内存地址是否仍保留 1 个字节
【发布时间】:2017-09-21 21:28:03
【问题描述】:

在 32 位机器中,如果你复制一个 int p,它将复制 4 个字节的信息,这些信息将分别在 0xbeefbeef、0xbeefbef0、0xbeefbef1、0xbeefbef2 处寻址。

这和 64 位一样吗?还是在单个地址存储 2 个字节?

【问题讨论】:

  • 如果您有 64 位地址总线,为什么有人要将 2 个字节组合到 1 个内存位置?有些架构每个地址有 2 个字节,但不依赖于 64 位或 32 位。
  • 老实说,事后看来,这个问题似乎很愚蠢。这是一个很好的观点。

标签: c memory 32bit-64bit


【解决方案1】:

这取决于架构。在大多数“正常”的 64 位系统(例如 arm64、x86_64 等)上,内存是“byte addressed”,因此每个内存地址指的是 一个 字节(因此它与您的 32-位示例)。

有些系统是不是字节寻址的,这可以包括64位架构。例如,DSPs 是一个典型的系统示例,其中char 可以是 32 位(或更多)并且单个字节(或者更确切地说是八位字节)是不可寻址的。

【讨论】:

  • 为什么不赞成这个答案?
  • 我们真的可以说这些系统不是字节寻址的吗? IE。例如,在 C 标准中,“char”与“byte”相同,与 CHAR_BIT 无关。
  • @Ruslan:这就是我澄清“或者更确切地说,八位字节”的原因。通常当有人说“字节”时,他们真正的意思是“八位字节”。如果一个系统的字节与一个字的大小相同,那么机器可能会被称为“字寻址”而不是“字节寻址”,即使从 C 标准的角度来看,它在技术上仍然是字节寻址(但肯定不是八位字节寻址,所以如果大多数人说机器不是字节寻址的,使用这个词的口语“byte == octet”含义,我一点也不感到惊讶。
【解决方案2】:

在 amd64 架构(也称为 x86_64 和 x64,这是最常见的 64 位架构)上,每个可寻址单元仍指一个字节的内存(8 位)。

此外,int 通常仍包含 4 个字节的内存(32 位),尽管这可能因编译器而异(在 32 位系统上也是如此)。

不同的是指针的大小。在 32 位系统上,指针通常是 32 位,但在 64 位系统上是 64 位(8 字节)。这将允许计算机访问 更多 字节的内存,但每个字节仍然是 8 位长。

【讨论】:

  • 问题与 int 的大小或指针的大小无关。它大约是可寻址内存位置的大小。
  • 即使在 64 位应用程序中,指针也可以是 32 位的,请参阅 x32 ABI
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
相关资源
最近更新 更多