【发布时间】:2011-01-19 21:28:14
【问题描述】:
我正在读一本书,它提到某些数据类型是长指针。只是好奇这意味着什么。谢谢。
【问题讨论】:
我正在读一本书,它提到某些数据类型是长指针。只是好奇这意味着什么。谢谢。
【问题讨论】:
一些处理器有两种类型的指针,一个近指针和一个远指针。近指针比远指针窄(因此范围有限)。远指针也可以是长指针。
一些处理器为附近的事物提供相对寻址。长指针可能表示项目不在附近,不能使用相对寻址。
在任何情况下,长指针都是特定于平台的问题,可能无法移植到其他操作系统或平台。
编辑: (进一步解释和使用相对寻址)
地址距离不是高级概念,而是汇编语言概念。 距离是从程序计数器(当前地址或下一个地址)和对象的开始(函数或数据)开始测量的。如果位置大于小相对指针的限制,则需要更长的指针。
示例:给定一个具有 32 位“长”寻址和 8 位相对寻址的系统。相对距离将允许在前向(正值)或前向(负)方向上至少有 127 个字节。如果目标在 1024 字节之外,则必须使用完整的 32 位指针。
这是基于大多数指令和数据都在附近的概念的优化功能。大多数循环在循环开始和循环结束之间的距离很小。这些使用相对寻址来执行。
大多数数据都在附近,无论是数据常量还是变量。更详细地说,数据靠近 帧 或参考点。局部变量放置在堆栈上,相对于帧或基地址。这个基地址是函数执行之前堆栈的开始。因此,可以使用相对于堆栈帧开始的寻址来访问数据。
处理器允许编译器使用专门的指令进行相对(近)寻址。在许多处理器上,使用相对寻址的指令比使用长地址的指令小。因此,处理器需要从指令缓存中获取的指令更少,指令缓存可以容纳更多的指令。
长和短,近和远,寻址可能取决于数据或函数的范围。还涉及其他因素,例如 PIC(位置独立代码)、虚拟内存和分页。
【讨论】:
根据这本书的年代,它可能指的是分段架构,其中有两种不同“大小”的指针:近指针,它指向本地段(并且可以适合 16 位),以及远或长指针,可以指向另一个段(因此更大)。这就是为什么您会在 Win32 API 中看到类似 LPVOID 的类型:LPVOID 是“指向 void 的长(远)指针”,即指向内存中任何位置的指针。
LP 和 NP 的使用是 Win16 和当时分段处理器架构的遗留物。在现代 Windows 中,由于具有扁平的虚拟地址空间,near 和 far 指针通常仅具有考古意义:只有一种指针,您可以忽略“near”和“long/far”限定符。
【讨论】:
LP 仍然用于指针类型的名称(如 LPDWORD)的原因只是 Win16 时代的遗留物 - Win32 上的 LPDWORD只是一个指针。在 Win16 上,它是一个“长”或“远”指针,但在 Win32 中不再存在这种区别。它仍然存在于类型名称中,因此为 Win16 编写和/或从那个时代复制过来的代码将很容易移植。这在 Win32 出现时非常重要。