18

大多数程序都非常适合小于 4GB 的地址空间,但需要使用仅在 x64 架构上可用的新功能。

是否有可以使用 x64 寄存器和特定指令但保留 32 位指针以节省内存的编译器/平台?

是否有可能在遗留代码上透明地做到这一点?什么开关可以做到这一点?

或者

在保持 32 位指针的同时获得 64 位功能需要对代码进行哪些更改?

4

10 回答 10

17

避免这种情况的一种简单方法是,如果您所指向的结构只有少数类型。然后你可以为你的数据分配大数组并使用uint32_t.

因此,此类模型中的“指针”只是全局数组中的索引。通常使用合适的编译器进行寻址应该足够有效,并且可以为您节省一些空间。您可能会丢失其他您可能感兴趣的东西,例如动态分配。

实现类似功能的另一种方法是将指针编码为与其实际位置不同的指针。如果您可以确保该差异始终适合 32 位,您也可以获得。

于 2010-11-07T11:39:15.130 回答
5

值得注意的是,有一个正在为 linux 开发的 ABI X32,它允许您构建使用 32 位索引和地址的 x86_64 二进制文件。

只是相对较新,但仍然很有趣。

http://en.wikipedia.org/wiki/X32_ABI

于 2012-08-19T02:22:55.147 回答
4

从技术上讲,编译器可以这样做。AFAIK,实际上还没有完成。它已被提议用于 gcc(即使这里有一个补丁:http: //gcc.gnu.org/ml/gcc/2007-10/msg00156.html)但从未集成(至少,我上次没有记录它)检查)。我的理解是它还需要内核和标准库的支持才能工作(即内核需要以目前不可能的方式进行设置,并且无法使用现有的 32 或 64 位 ABI 与内核通信)。

于 2010-11-07T17:29:40.527 回答
3

您需要的“64 位功能”究竟是什么,是不是有点模糊?

在寻找答案时发现了这个:http: //www.codeproject.com/KB/cpp/smallptr.aspx

也拿起底部的讨论...

从来没有任何需要考虑这一点,但有趣的是意识到人们可以关心指针需要多少空间......

于 2010-11-07T22:18:52.690 回答
2

这取决于平台。在 Mac OS X 上,64 位进程地址空间的前 4 GB 被保留和未映射,大概是作为一种安全功能,因此不会将32 位值误认为是指针。如果你尝试,可能有办法打败它。我通过编写一个 C++“指针”类来解决它,它将 0x100000000 添加到存储的值中。(这比索引到数组要快得多,后者还需要在加法之前找到数组基地址并进行乘法运算。)

在 ISA 级别上,您当然可以选择加载和零扩展 32 位值,然后将其用作 64 位指针。对于平台来说,这是一个很好的功能。

除非您希望同时使用 64 位和 32 位指针,否则无需对程序进行任何更改。near在那种情况下,你又回到了拥有和far指针的糟糕日子。

此外,您肯定会破坏 ABI 与采用指向指针的 API 的兼容性。

于 2010-11-07T08:37:02.283 回答
2

在 x86 上,没有。在其他处理器上,例如 PowerPC,这很常见 - 64 位寄存器和指令在 32 位模式下可用,而对于 x86,它往往是“全有或全无”。

于 2010-11-07T08:59:30.697 回答
2

我认为这类似于 MIPS n32 ABI:具有 32 位指针的 64 位寄存器。

在 n32 ABI 中,所有寄存器都是 64 位的(因此需要 MIPS64 处理器)。但是地址和指针只有 32 位(当存储在内存中时),减少了内存占用。将 32 位值(例如指针)加载到寄存器中时,会将其符号扩展为 64 位。当处理器使用指针/地址进行加载或存储时,将使用所有 64 位(处理器不知道 SW 的 n32-ess)。如果您的操作系统支持 n32 程序(可能操作系统也遵循 n32 模型,或者它可能是添加了 n32 支持的适当 64 位操作系统),它可以将 n32 应用程序使用的所有内存定位在合适的内存中(例如较低的 2GB 和较高的 2GB 虚拟地址)。此模型的唯一故障是当寄存器保存在堆栈上(函数调用等)时,所有 64 位都被使用,n32 ABI 中没有 32 位数据模型。

可能这样的 ABI 也可以用于 x86-64。

于 2012-02-17T17:37:59.363 回答
1

恐怕如果您担心指针的大小,您可能会遇到更大的问题需要处理。如果指针的数量将达到数百万或数十亿,那么在实际耗尽物理或虚拟内存之前,您可能会在 Windows 操作系统中遇到限制。

Mark Russinovich 写了一篇与此相关的精彩文章,名为“Pushing the Limits of Windows: Virtual Memory”

于 2010-11-07T10:26:15.517 回答
1

Linux 现在对 X32 ABI 提供了相当全面的支持,这正是提问者所要求的,实际上它作为 Gentoo 操作系统下的配置得到了部分支持。我认为这个问题需要根据最近的发展进行审查。

于 2014-02-21T14:49:30.027 回答
0

您问题的第二部分很容易回答。很有可能,事实上许多 C 实现都支持使用 32 位代码的 64 位操作。通常用于此的 C 类型是long long(但请检查您的编译器和体系结构)。

据我所知,在 64 位本机代码中不可能有 32 位指针。

于 2010-11-07T08:38:17.293 回答