什么是长指针?

num*_*l25 34 c c++ pointers

我正在读一本书,它提到某些数据类型是长指针.只是好奇这意味着什么.谢谢.

Tho*_*ews 40

一些处理器有两种类型的指针,一个近指针和一个远指针.近指针比远指针更窄(因此具有有限的范围).远指针也可以是长指针.

一些处理器为附近的事物提供相对寻址.长指针可以指示该项目不在附近,并且不能使用相对寻址.

在任何情况下,长指针都是特定于平台的问题,并且可能无法移植到其他操作系统或平台.

编辑:( 进一步解释和使用相对寻址)

地址距离不是高级概念,而是更多的汇编语言概念.该距离是从程序计数器(无论是当前地址或下一个地址)和对象(功能或数据)的开始进行测量.如果位置大于小的相对指针的限制,则需要更长的指针.

示例:给定一个具有32位"长"寻址和8位相对寻址的系统.相对距离将允许前向(正值)或前一(负)方向中的至少127个字节.如果目标是1024字节,则必须使用完整的32位指针.

这是一个基于大多数指令和数据都在附近的概念的优化功能.大多数循环在循环开始和循环结束之间的距离很小.它们采用相对寻址来执行.

大多数数据都在附近,无论是数据常量还是变量.更详细地,数据靠近或参考点.局部变量相对于帧或基地址放置在堆栈上.该基地址是执行函数之前的堆栈的开始.因此,可以使用相对于堆栈帧开始的寻址来访问数据.

处理器允许编译器使用专用指令进行相对(近)寻址.在许多处理器上,使用相对寻址的指令小于使用长地址的指令.因此,处理器从指令高速缓存中获取较少的读取,并且指令高速缓存可以保存更多指令.

长和短,近和远,寻址可能取决于数据或功能的范围.还涉及其他因素,例如PIC(位置独立代码),虚拟内存和分页.

  • "范围"在此级别不再存在 - 只有很长的字节数组.您的所有代码都会转换为汇编代码,并在内存中进行布局.当事情足够接近时,编译器会生成近指针,当编译器需要生成远指针时. (2认同)

ito*_*son 29

根据书的年龄,它可能指的是分段架构,其中指针有两种不同的"大小":靠近指针,指向本地段(并且可以适合16位),以及远或长指针,可以指向另一个段(因此更大).这就是为什么你在Win32 API中看到像LPVOID这样的类型的原因:LPVOID是一个"指向void的长(远)指针",即指向内存中任何位置的指针.

LP和NP的使用是Win16的遗留问题和当时的分段处理器架构.在现代Windows中,由于其平坦的虚拟地址空间,近端和远端指针通常只具有考古学意义:只有一种指针,你可以忽略"近"和"长/远"限定符.

  • @ numerical25:在命令类型的名称中仍然使用`LP`的原因(如`LPDWORD`)只是Win16时代遗留下来的遗产 - Win32上的`LPDWORD`只是一个指针.在Win16上,它是一个"长"或"远"指针,但Win32中不再存在这种区别.它仍然在类型名称中,因此为Win16编写和/或从该时代复制的代码将很容易移植.当Win32出现时,这非常重要. (12认同)