我正在读一本书,它提到某些数据类型是长指针。只是好奇这意味着什么。感谢。
答案 0 :(得分:40)
某些处理器有两种类型的指针,一个是近指针,一个是远指针。近指针比远指针更窄(因此具有有限的范围)。远指针也可以是长指针。
某些处理器为附近的事物提供相对寻址。长指针可能表示该项目不在附近,并且无法使用相对寻址。
在任何情况下,长指针都是特定于平台的问题,可能无法移植到其他操作系统或平台。
修改 (进一步解释和使用相对寻址)
地址距离不是高级概念,而是更多的汇编语言概念。 距离是从程序计数器(当前地址或下一个地址)和对象的开始(函数或数据)测量的。如果位置大于小的相对指针的限制,则需要更长的指针。
示例:给定一个具有32位“长”寻址和8位相对寻址的系统。相对距离将允许前向(正值)或前一(负)方向中的至少127个字节。如果目标是1024字节,则必须使用完整的32位指针。
这是一个基于大多数指令和数据都在附近的概念的优化功能。大多数循环在循环开始和循环结束之间的距离很小。它们采用相对寻址来执行。
大多数数据都在附近,无论是数据常量还是变量。更详细地说,数据靠近帧或参考点。局部变量相对于帧或基地址放置在堆栈上。该基地址是执行函数之前的堆栈的开始。因此,可以使用相对于堆栈帧开始的寻址来访问数据。
处理器允许编译器使用专用指令进行相对(近)寻址。在许多处理器上,使用相对寻址的指令小于使用长地址的指令。因此,处理器需要从指令高速缓存中获取较少的内容,并且指令高速缓存可以保存更多指令。
长和短,近和远,寻址可能取决于数据或函数的范围。还涉及其他因素,例如PIC(位置独立代码),虚拟内存和分页。
答案 1 :(得分:28)
根据书的年龄,它可能指的是分段架构,其中指针有两种不同的“大小”:靠近指针,指向本地段(并且可以适合16位),以及远或长指针,可指向另一个段(因此更大)。这就是你在Win32 API中看到像LPVOID这样的类型的原因:LPVOID是一个“指向void的长(远)指针”,即指向内存中任何位置的指针。
LP和NP的使用是Win16的遗留问题和当时的分段处理器架构。在现代Windows中,由于其平坦的虚拟地址空间,近端和远端指针通常只具有考古学意义:只有一种指针,你可以忽略“近”和“长/远”限定符。