【问题标题】:What is a long pointer?什么是长指针?
【发布时间】:2011-01-19 21:28:14
【问题描述】:

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

【问题讨论】:

标签: c++ c pointers


【解决方案1】:

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

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

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

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

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

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

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

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

处理器允许编译器使用专门的指令进行相对(近)寻址。在许多处理器上,使用相对寻址的指令比使用长地址的指令小。因此,处理器需要从指令缓存中获取的指令更少,指令缓存可以容纳更多的指令。

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

【讨论】:

  • 这个距离是用它的范围来衡量的吗?它被封装了多少次?谢谢!
  • @numerical25:请解释“它被封装了多少次?”。寻址未封装。
  • "scope" 在此级别不再存在 - 只有一个长字节数组。你所有的代码都会被翻译成汇编,然后放在内存中。当事物足够接近时,编译器会生成近指针,当距离较远时,编译器需要生成远指针。
  • 如果您不赞成这个答案,请留下解释。谢谢。
【解决方案2】:

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

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

【讨论】:

  • 本书使用 Direct X 9, MSVS C++ 2008 express。版权所有 2010。有些数据类型以 LP 开头。但我得到了 2 个不同的答案,所以我猜它们可能意味着 2 个不同的东西
  • 也许您可以在上下文中发布其中一个提及(例如,它出现的句子)——然后我们可以更具体地解释该上下文中的重要性。例如。它只是解释为什么某些数据类型具有 LP 前缀的旁注吗?
  • 关于分段的定义,我就走懦夫的出路,指点你维基百科:en.wikipedia.org/wiki/X86_memory_segmentation
  • @numerical25:LP 仍然用于指针类型的名称(如 LPDWORD)的原因只是 Win16 时代的遗留物 - Win32 上的 LPDWORD只是一个指针。在 Win16 上,它是一个“长”或“远”指针,但在 Win32 中不再存在这种区别。它仍然存在于类型名称中,因此为 Win16 编写和/或从那个时代复制过来的代码将很容易移植。这在 Win32 出现时非常重要。
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 2013-03-07
  • 2013-05-05
  • 2012-03-07
  • 2010-11-26
  • 2010-09-14
相关资源
最近更新 更多