64 位处理器(Intel i3/i5/i7)内存中变量地址的大小是多少

64 位处理器(Intel i3/i5/i7)内存中变量地址的大小是多少

它是 64 位地址吗?还是仍然是 32 位?或者我可能误读了地址是 48 位?或者英特尔使用一个单元的 32 位地址和另一个 32 位单元的一半构成 48 位?那么,对变量使用单个字符指针时,地址本身的大小 (0xFFEDEDAC) 是多少?4 个字节?

答案1

如果我们谈论的是虚拟地址,即在任何现代操作系统下运行的代码使用的地址……以及在“长模式”下运行的程序……地址通常以 64 位(8 个字节)存储。但在架构规范中,只实现了低位 48 位。其余 16 位(位 48 至 63)必须是位 47(已实现位中的最高位)的副本。

这样一来,地址空间乍一看是从 0x00000000'00000000 到 0xFFFFFFFF'FFFFFFFF。但实际上可以使用的地址只有以下范围内的地址:

0x00000000'00000000 through 0x00007FFF'FFFFFFFF
0xFFFF8000'00000000 through 0xFFFFFFFF'FFFFFFFF

这使得理论上的地址空间为 2 的 64 倍(16 艾字节,或约 18x10^18)。这些数字当然是 32 位处理器的数字的平方。但实际上只实现了 256^48 字节,后者被分成两个大小相等的部分,每个部分为 128 TiB。

(Windows 中的用户模式使用前半部分,每个进程都会重新实例化。内核模式使用后半部分,所有进程大致相同。)

顺便说一句,内存中没有 64 位或 32 位“单元”。只有字节。x86/x64 是字节寻址的。

对于您的具体示例,您的指针将占用内存中的 8 个字节......除非您在兼容模式下运行 32 位程序,在这种情况下它将占用 4 个字节。

相关内容