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