指针存储内存地址,因此其大小是内存地址的大小,而内存地址的大小取决于内存位置的数量。另一方面,字大小是指令可以执行的最大单位,因此内存位置的大小无关紧要,因为一次可以收集多个内存位置。那么字大小和指针大小之间有什么关系呢?
答案1
它们不必相同,并且不使用它们的计算机系统的数量远远超过使用它们的计算机系统的数量。不过,指针大小和“字”大小之间还是存在一些关系。
程序会执行大量指针运算。数组下标是指针加法。指针会相互比较。如果您的 CPU 无法对指针大小的东西进行运算,则必须将地址拆分到多个变量中,从而产生分段或分组的地址空间。这些地址空间管理起来很复杂,并且会导致指针类类型(近指针、远指针、基指针)的激增。因此,您会遇到额外的奇怪限制,例如链接列表能够容纳比数组更多的项目。
尽管如此,具有 8 位数据总线和更大地址空间(可能仅用于代码而不是数据)的微控制器仍然很常见。另一方面,具有 32 位或 64 位指针的现代通用 CPU 具有比指针更宽的数据字(例如,现代 x86_64 CPU 的 AVX 子系统中的数据字为 512 位)。许多无锁算法依赖于对数据的原子访问,而这些数据至少是指针大小的两倍。
答案2
TLDR:可能是巧合。
指针本身不是计算机架构的一部分,它是一种编程语言功能。例如,Windows API 定义了自己的指针类型及其大小。在 Windows 上的 C 中,指向 char ( char*
) 的指针在 32 到 64 位之间变化,具体取决于您的版本。字的大小可能与它关系不大。
单词是一个非常常用的词,咳咳,术语。在 CPU 架构中,一个字可以指指令的大小、数据总线、内存总线等。在Windows API一个单词是一个无符号短整型,即至少2 个字节,因此取决于短裤如何实现。
MS 字和指令大小字之间可能存在关联,但我认为您需要一位操作系统开发人员来讨论这个问题,而且我怀疑它是否会影响指针的大小。
答案3
计算机寄存器和内部总线曾经从 4 位发展到 8 位,然后是 16 位、32 位,目前是 64 位。最大地址空间取决于指针的大小(尽管一些早期的 CPU,例如 Z80A,可能页内存块的大小与指针的大小相同)。
随着总线变宽,RAM 也随之增加,因此指针的大小也随之增加。不过,有时操作系统无法跟上更大的总线,例如在从 Windows 7 32 位到 64 位的过渡中,最大可寻址 RAM 首先从 4 GB 移至 8 GB,最后在高端版本上移至 192 GB。
因此,寄存器和总线的大小(从半字节到字节,然后是一个字,然后在 MS 16 位操作系统中是一个 DWORD)任意增加,地址空间也是如此。@DarkDust 提供了更完整的解释。