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