【问题标题】:Using a 64bit uint for pointer values in 32bit mode?在 32 位模式下使用 64 位 uint 作为指针值?
【发布时间】:2013-12-05 18:25:37
【问题描述】:

我正在实现一种基于 C 的编程语言,并且我想实现一种编译模式,它与它是在 32 位还是 64 位模式下运行无关。我所有的数据类型都有明确的宽度,所以二进制兼容性没有问题,唯一有问题的方面是指针。

那么,即使在 32 位模式下,如果我要明确的 64 位指针实现怎么办? IIRC 几乎所有的内存控制器都是至少 64 位的,所以读取和写入仍然是一个周期,但是整数运算呢?

除了增加内存占用之外,这种方法是否有任何潜在的缺点?还有其他潜在的警告吗?

编辑:让我澄清一下场景背景 - 最初的问题有点偏离。我需要解释器字节码的“二进制不可知模式”才能动态桥接不同的本机二进制文件。自然,在 32 位二进制中使用来自 64 位二进制的指针几乎没有意义,但指针的宽度会影响其他数据位置的偏移量,这将主要被交换。所以简而言之,这个想法如下 - 为了使数据结构二进制兼容 32 位和 64 位二进制文​​件而浪费一点空间。

【问题讨论】:

  • 你的目标不明确。你想要源码级还是二进制级的兼容性?你不能拥有后者,至少在英特尔架构上是这样。前者是可能的,但我看不出它会给你带来什么。
  • 为什么二进制兼容是不可能的?
  • 您无法在 32 位操作系统上运行任何语言的 64 位可执行文件。 CPU 根本不会进入 64 位模式。这是一个特权过渡,操作系统不会让它发生。您必须编写一个内核模式组件,以便在每次系统调用或上下文切换时在 32 位和 64 位模式之间来回切换。
  • 是的,这是不言而喻的,我的目标是更具体的使用场景——除了编译为原生我的语言还支持编译为字节码以进行解释,这将是 32 位和 64 位二进制文​​件之间的桥梁只要我在程序布局中保持完全的二进制兼容性。
  • “32 位模式”和“64 位模式”的概念不一定适用于解释代码。这些模式是架构规范的属性。您可以(非常低效地)在 2 位 FPGA 上实现 AMD64 架构规范,它将运行 64 位 Windows(缓慢)。对于解释代码,您的架构规范就是您的解释器规范。你的解释器是如何实现的并不重要。它可以是 32 位可执行文件、64 位可执行文件或由生锈的铁路车厢制成的图灵机。重要的是它与外界的接口。

标签: c pointers 32bit-64bit binary-compatibility


【解决方案1】:

您可以使用uintptr_t 类型。

它是一个unsigned int,保证与指针大小相同。

它的定义在 C++11 和 C99 中是标准的(使用 <stdint.h> 头文件)。

如果您希望指针始终为 64 位,您可以使用 uint64_t。但是,这在具有 128 位指针的系统上是不安全的。

【讨论】:

  • 由于问题是关于 C 的,所以它也是 C99 的一部分,在 <stdint.h> 中定义。
  • 有 128 位机器的例子吗?
  • @user2341104:en.wikipedia.org/wiki/128-bit C/C++ 标准并没有禁止它。是的,一旦你想为它构建这种代码,你就必须修补它。
  • @SergeyK。 - 当然,现代处理器通过 SIMD 支持 128、256 甚至 512 位操作,但如果我没记错的话,这与指针无关。此外,我不打算让我的语言针对当前的 intel、amd 和 arm 处理器,它们都是 32 位或 64 位。
  • 可能不存在具有 128 位指针的机器。没必要。
【解决方案2】:

并非所有 32 位机器上的 64 位访问都是原子的。至于算术,典型的 32 位机器没有 64 位算术单元,因此编译器使用构建在 32 位算术单元之上的运行时支持函数来实现 64 位算术。

我想如果你确实持有一个 64 位数据类型的 32 位指针,你会忽略一半的位。在 32 位模式下运行时,您将对 64 位指针执行 32 位操作。当只有 32 位有意义时,执行 64 位操作显然没有意义。在这种情况下,您将只有一个 32 位类型,存储在 64 位插槽中,浪费了一半的位。

鉴于此,您所描述的对我来说似乎毫无意义。在我看来,您已经决定希望所有数据类型都具有相同的大小,无论您是使用 32 位还是 64 位。对于某些数据类型来说,这可能是一个理想的目标,但对于指针来说却不是这样。

【讨论】:

  • 所以我在单线程场景中应该是安全的?而且我认为我仍然可以使用 32 位原子在 32 位模式下锁定 64 位数据类型?如果我错了,请纠正我,我只是在做出相当未受过教育的假设。
  • 我不太明白那个评论。在我看来,你正在尝试的东西毫无意义。你能给出一个很好的理由,为什么你想将 32 位指针存储在 64 但类型中?你的目标是让生成的代码运行得很慢吗?
  • 目标是能够为解释器创建数据结构,以在 32 位和 64 位本机二进制文件之间创建结构,因此两者都可以对相同的数据进行操作而不会出现任何偏移不匹配。
  • 我认为您绝对没有理由为了实现该目标而削弱您的程序。无需如此浪费的指针存储就可以轻松满足。
  • 它不适用于大型程序,仅用于本机代码之间共享内存中的微小桥梁。我希望不同架构二进制文件之间接口的便利性将超过潜在的开销。
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 2013-01-11
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多