由CPU地址总线宽度、系统页面地址空间和编译器决定的。如果CPU允许的情况下,编译器在编译64位程序时也可以按照CPU最大64位宽度进行寻址,那么由这个编译器编译的程序就是64位(8字节)。但是你必须明白一个重点,系统寻址不是直接按物理地址访问内存的,而是通过"拼接”的(段地址+逻辑地址),拼接后的地址提交给物理层以便提取数据,这是由于历史原因造成的,而逻辑地址在Windows中叫做分页,当然Windows可能内部也不是完全等效于逻辑地址。
因而大多数编译器目前来说逻辑地址都是32位的,一个是由于历史原因及为了兼容性,还有个因素:地址宽度决定了地址空间大小,32位可以寻址4G空间,对于大部分程序来说,4G逻辑地址的空间足够了。同时也方便地址管理及映射,太小了一个进程可能需要分配多个内存页不方便(一个程序内部要来回切换页面,会增加管理开销),对于运行一个小程序,太大的地址空间浪费内存,因此32位是个非常合适位宽,既方便各种CPU一次寻址,又兼顾内存分配方案(和磁盘扇区大小的决策类似)。
以上描述内存分配的有些地方不一定完全符合事实,但是我只是为了方便描述PC机的地址寻址机制:段地址+逻辑地址=物理地址。
温馨提示:答案为网友推荐,仅供参考