32位处理器真的可以处理2 ^ 32个内存位置吗?

hou*_*oft 8 c memory 32-bit

我觉得这可能是一个奇怪/愚蠢的问题,但是这里......

在问题中,C中的NULL是否需要/定义为零?,已经确定的是,NULL指针指向一个不可寻址存储器位置,并且还认为NULL0.

现在,据说32位处理器可以解决2^32内存位置问题.

2^32只是可以使用32位表示的不同数字的数量.这些数字中有0.但是,因为0,也就是说,NULL应该指向什么,我们不应该说32位处理器只能寻址2^32 - 1内存位置(因为0它不应该是一个有效的地址)?

Gab*_*abe 9

如果32位处理器可以处理2 ^ 32个内存位置,那么这只意味着该架构上的C指针可以引用2 ^ 32-1个位置加上NULL.

  • +1:最简单的答案.关于虚拟内存的所有这些都是无关紧要的. (2认同)

Bil*_*eal 8

NULL指针指向不可寻址的内存位置

这不是真的.从您链接的问题中接受的答案:

请注意,由于如何制定空指针的规则,用于分配/比较空指针的值保证为零,但实际存储在指针内的位模式可以是任何其他东西

我所知道的大多数平台实际上通过将地址空间的前几页标记为无效来处理此问题.这并不意味着处理器无法解决这些问题; 它只是一种方便的方法,使低值成为无效指针.例如,几个Windows API使用它来区分资源ID和指向实际数据的指针; 低于某个值的所有内容(如果我没记错的话,为65k)不是有效指针,而是有效的资源ID.

最后,仅仅因为C说某事并不意味着CPU需要以这种方式受到限制.当然,C表示访问null模式是未定义的 - 但是没有理由在汇编中进行编写需要受到这些限制.真正的机器通常可以做得比C标准所说的要多得多.虚拟内存,SIMD指令和硬件IO是一些简单的例子.