【问题标题】:Near and Far pointersNear 和 Far 指针
【发布时间】:2010-10-06 06:00:06
【问题描述】:

我们常用的指针(我们通常使用的指针)、近指针和远指针之间有什么区别?在当今的 C/C++ 系统中,近指针和远指针有实际用途吗?任何需要使用这些特定指针而不是其他 c、c++ 语义的实际场景都会非常有帮助。

【问题讨论】:

  • @sbi 没错,在我的专业经验中从未见过或使用过它们,只是确保我不会错过不了解它们的机会 :)
  • 但是他们在C而不是C++...不是吗?还是错过了什么??
  • @liaK:他们也不在。它们在两者的一些虚假实现中,如果它们使用 nearfar 作为关键字,这些实现是不一致的(而如果它们使用 __near__far_Near 和 @987654328,它们可能是一致的@)。

标签: c++ c pointers


【解决方案1】:

near 和 far 关键字起源于英特尔之前的分段内存模型。近指针只能访问最初大小约为 64Kb 的内存块,称为段,而远指针可以超出由段和该段中的偏移量组成的范围。近指针比远指针快得多,因此在某些情况下使用它们是值得的。

现在虚拟内存的近端和远端指针已经没有用了。

编辑:对不起,如果我没有使用正确的术语,但这就是我在当天使用它时记得它的方式:-)

【讨论】:

  • @cHao:实际上,没有。在 C 和 C++ 中,它们被称为指针,并且只有指针。它只是一种处理器架构,需要为其量身定制的编译器来引入非标准扩展。
  • @sbi:它们很常见,足以成为事实上的标准,ISO 和 ANSI 都该死。谢天谢地,它们已经消失了,但是当它们存在时,x86 世界中每个有用的 C 和 C++ 编译器(阅读:现有的最常见和最重要的架构之一)都必须拥有它们。它们不在 ISO/ANSI 标准中并不会降低它们的重要性,或者在现实世界中不那么“标准”。
  • @cHao:我不同意。那时每个有用的编译器都有一个“巨大的”内存模型,如果你用它编译,far 关键字是完全没有必要的,你基本上可以只写理智的 C 代码并假装你有一半可用的线性内存量。
  • @R.. 除了这样做会导致指针变慢很多,因为(1)无论如何它们都是远指针,无论您是否需要,并且(2)总是有一些正在进行调整以保留大量线性内存的错觉。我个人认为“巨大的”内存模型对于那些真正关心性能的人来说是最后的手段(当时,几乎每个人都是如此)。无论哪种方式,far 关键字都在那里,任何没有它的 16 位编译器都是“不合格的”。
  • @KeithThompson:我敢肯定你们中的一些人。我记得曾经我自己也想要一个 SPARC。但我也很确定,在 Java 出现之前,世界上大多数人甚至都不知道 Sun 的存在。 :)
【解决方案2】:

near 和 far 是在机器架构的上下文中说的(x86、x64、640kb + 内存模型,x32 表示保护模式和分段,x86 表示分段内存)

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

现在只有 x86 x32 寻址 - 长指针和 x64 64 位寻址正在占据(永久)位置。是的,Windows 中的 x64 是由 MS VC 编译的,它“看到”的方式仍然像 x86 x32 应用程序只有 4Gb 的内存。因此,默认情况下,您不知道 near 和 far 或其他一些地址之间的区别。但是 x64 目标可以使用另一种 long long 类型的指针来寻址内存。

如您所见,如果您没有“看到”不同指针中 x32 上 x64 寻址的变体,则 MS VC 中没有实际场景。只是一个hypotetics。

远离这种实际用途的是 LP_STRING - 指向字符串的长指针 和 INT_PTR - 保存指针值的整数。

首先您必须了解,CPU 和编译器接受使用指针大小的集合。而且只有他们。如果没有额外的编译器/链接器/硬件,您将无法找到绕过它们的方法。 INT_PTR - 仅用于存储长度不超过 int 的指针(指针的值,其中指针长度不大于 int)。 和 LP_STRING - 只是编译器/处理器的长指针类型(它们都喜欢抽象并且编译器在行为上与编译器不相等,以及 x64 可以是 Intel 很少使用而广泛使用的 AMD)。

任何大小的变量都可以是指针。

您只需要一个针对 AMD x64 和 LLP(长长指针)的实际示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多