为什么没有任何近,远和; 32位编译器中的巨大指针?

时间:2013-02-23 22:05:09

标签: c x86

为什么没有近,远和远的概念32位编译器中的巨大指针?据我所知,在16位8086架构编译器上创建的程序可以有1 MB的大小,其中有数据段,图形段等。要访问所有这些段并保持指针增量概念,我们需要这些不同的指针,但为什么在32位中它不是必需的?

2 个答案:

答案 0 :(得分:7)

32位编译器可以通过一个32位指针寻址程序(或操作系统)可用的整个地址空间。不需要基础,因为指针足够大以解决可用地址空间中的任何字节。

理论上可以设想一个32位OS来解决> 4GB的内存(因此需要与16位操作系统共用的段系统),但实际情况是64位系统在出现复杂性需求之前就已经可用。

答案 1 :(得分:2)

  

为什么没有近,远和远的概念32位编译器中的巨大指针?

这取决于平台和编译器。 Open Watcom C / C ++支持16位代码中的近,远和巨大指针以及32位代码中的近和远指针。

  

据我所知,在16位8086架构编译器上创建的程序可以有1 mb大小,其中有数据段图形段等。要访问所有这些段并保持指针增量概念,我们需要这些不同的指针,但为什么在32位中它不是必需的?

因为在大多数情况下,32位指针附近足以覆盖整个地址空间(所有2 32 字节= 4 GB),而不是近距离或远距离16-位指针,正如你所说,你自己只能覆盖1 MB内存(严格来说,在80286+的16位保护模式下,你可以使用16位远指针来寻址至少16 MB的内存,这是因为那些指针是相对于段的开头而且80286+上的段可以从前16 MB中的任何地方开始,因为全局描述符表(GDT)中的段描述符或本地描述符表(LDT )为段的起始地址保留24位(2 24 bytes = 16 MB))。