在32位模式下使用64位uint作为指针值?

时间:2013-11-21 10:27:07

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

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

那么,即使在32位模式下,如果我选择明确的64位指针实现呢? IIRC几乎所有的内存控制器至少都是64位,所以读写仍然只是一个循环,但整数运算呢?

除了内存占用量增加外,这种方法还有任何潜在的弊端吗?还有其他潜在的警告吗?

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

2 个答案:

答案 0 :(得分:0)

您可以使用uintptr_t类型。

保证unsigned int与指针的大小相同。

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

如果希望指针始终为64位,则可以使用uint64_t。但是,这对于具有128位指针的系统来说是不安全的。

答案 1 :(得分:0)

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

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

鉴于此,你所描述的对我来说似乎毫无意义。在我看来,你已经决定所有数据类型都需要具有相同的大小,无论你是32位还是64位。对于某些数据类型而言,这可能是一个理想的目标,但指针并非如此。