Cprogramming 简明教程
Near, Far, and Huge Pointers in C
诸如 near pointers 、 far pointers 和 huge pointers 之类的概念在 C programming language 中用于处理分段内存模型。但是,这些概念在具有改进的 CPU architecture 的现代计算环境中已不再相关。
near, far, and huge pointers 的概念在16位英特尔架构中,在MS DOS操作系统时代得到实现。
Near Pointer
C中的“ near ”关键字用于声明一个 pointer ,它只能访问当前数据段内的内存。16位计算机上的 near pointer 是指针,它只能存储16位地址。
在特定时间内,一个 near pointer 只能访问大约 64 kb 的少量数据,这是它最主要的缺点。近指针的大小为 2 字节。
Far Pointer
一个 far pointer 是一个 32 位指针,它可以在给定段中访问 computer memory 之外的信息。要使用此指针,必须分配“段寄存器”来存储段中的数据地址,并且还必须在最近的段中存储另一个段寄存器。
一个 far pointer 存储指针正在差异的偏移量和段地址。当指针增加或减少时,只有偏移量部分会改变。远指针的大小为 4 字节。
Huge Pointer
一个 huge pointer 具有与 far pointer 相同的 32 位大小。巨大的指针还可以访问位于段之外的位。
远指针是固定的,因此它们所在的段的部分不能以任何方式修改;然而,可以修改巨大的指针。
在巨大的指针中,偏移量和段地址都会改变。这就是为什么我们可以使用 huge pointer 从一个段跳转到另一个段。当它们比较绝对地址时,可以在其上执行关系运算。巨大的指针的大小为 4 字节。
Pointers to Remember
在使用近、远和巨大指针时,请记住以下几点 -
-
近指针只能存储直至第一个 64kB 地址,而远指针可以存储 RAM 中任何内存位置的地址。巨大的指针可以在多个内存段之间移动。
-
近指针只能在单个寄存器中存储地址。另一方面,远指针使用两个寄存器来存储段和偏移量地址。近指针的大小为 2 字节,而远和巨大指针的大小为 4 字节。
-
两个远指针值可以指向相同的位置,但在巨大指针的情况下,则不可能。
近、远和巨大指针用于根据分段内存架构中的 segment registers 来管理内存访问。现代系统使用平面内存模型,其中内存被寻址为一个连续的空间。现代 C 编译器提供了更好的内存管理技术,这些技术不依赖于分段概念。