什么是长指针?

46

我正在阅读一本书,它提到某种数据类型被称为“长指针”,想知道这是什么意思。谢谢。


3
MSDN 中的历史解释:http://msdn.microsoft.com/zh-cn/library/windows/desktop/ff381404(v=vs.85).aspx - Nate Glenn
2个回答

51
有些处理器有两种类型的指针,即近指针和远指针。近指针比远指针窄(因此具有有限的范围)。远指针也可以是长指针。
有些处理器提供相对寻址来处理附近的事物。长指针可能表示该项不靠近,无法使用相对寻址。
无论如何,长指针是一个特定平台的问题,可能无法在其他操作系统或平台上移植。
编辑:(进一步解释和相对寻址的用法)
地址距离更多是一个汇编语言的概念,而不是高级概念。距离是从程序计数器(当前地址或下一个地址)到对象(函数或数据)的起始位置的测量。如果位置超过了小的相对指针的限制,就需要使用更长的指针。
例如:给定一个具有32位“长”寻址和8位相对寻址的系统。相对距离将允许正向(正值)或向前(负值)至少127个字节。如果目标距离为1024个字节,则必须使用完整的32位指针。
这是一个基于大多数指令和数据附近的概念进行优化的功能。大多数循环的起始点和结束点之间的距离很小。这些循环使用相对寻址进行执行。
大多数数据都是附近的,无论是数据常量还是变量。更详细地说,数据靠近一个“帧”或参考点。局部变量相对于帧或基地址放置在堆栈上。这个基地址是在函数执行之前堆栈的起始点。因此,可以使用相对于堆栈帧起始点的寻址来访问数据。
处理器允许编译器使用专门的指令进行相对(近)寻址。在许多处理器上,使用相对寻址的指令比使用长寻址的指令更小。因此,处理器需要从指令缓存中获取的内容更少,而指令缓存可以容纳更多的指令。
长、短、近、远的寻址可能取决于数据或函数的范围。还涉及其他因素,如位置无关代码(PIC)、虚拟内存和分页。

这个距离是由它的作用域来衡量的吗?它被封装了多少次?谢谢! - numerical25
@numerical25:请解释一下“它被封装了多少次?”。寻址并没有被封装。 - Thomas Matthews
2
“作用域”在此级别上不再存在——只有一长串字节。您的所有代码都被转换为汇编语言,并按顺序排列在内存中。当距离足够近时,编译器会生成近指针,当距离较远时,编译器需要生成远指针。 - Justin Smith
如果您对此答案进行了负评,请留下解释。谢谢。 - Thomas Matthews

38

根据书籍的年代不同,它可能指的是分段架构,其中存在两种不同的“大小”指针:近指针,指向本地段(可以适合16位),远或长指针,可以指向另一个段(因此更大)。这就是为什么在Win32 API中看到像LPVOID这样的类型:LPVOID是指向内存中任何位置的“long(far)pointer to void”,即指针。

LP和NP的使用是Win16和当时分段处理器架构的遗留物。在现代Windows中,由于其平面虚拟地址空间,近指针和远指针通常只具有考古价值:只有一种指针类型,您可以忽略“near”和“long / far”限定符。


1
这本书使用Direct X 9、MSVS C++ 2008 express。版权所有2010年。一些数据类型以LP开头。但我得到了两个不同的答案,所以我猜它们可能有两种不同的含义。 - numerical25
也许您可以在上下文中发布其中一个提及(例如,它出现的句子)--然后我们可以更具体地解释其在该上下文中的重要性。例如,它只是一个附注,解释为什么一些数据类型具有LP前缀吗? - itowlson
1
关于分段的定义,我会采取懦夫的方式,指向维基百科:http://en.wikipedia.org/wiki/X86_memory_segmentation - itowlson
15
“LP” 仍然出现在指针类型的名称中(如“LPDWORD”)的原因只是传承自Win16时代的历史遗留问题 - 在Win32中,“LPDWORD”只是一个指针。在Win16中,它是一个“long”或“far”指针,但这种区别在Win32中已经不存在了。它仍然存在于类型名称中,以便能够轻松移植为Win16编写的代码和复制自那个时代的代码。这在Win32刚出现时非常重要。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接