我们知道在64位计算机中指针将是8字节, 这将使我们能够解决巨大的记忆。 但另一方面,普通人可以使用的记忆 现在高达16G,这意味着目前我们不需要8个字节 addressig,但最多5个或最多6个字节。
我是Delphi用户。
问题(可能是64位编译器的开发人员)是:
是否可以在某处声明您想要多少字节 用于指针,这对整个应用程序都有效。 如果你有数百万指针的应用程序,你会 能够声明指针只有5个字节,即内存量 将被占用的人将会低得多。 我可以想象这可能很难实现, 但无论如何我对它很好奇。
提前致谢。
答案 0 :(得分:5)
一百万个64位指针将占用不到八兆字节。没什么。典型的现代计算机具有6 GB的RAM。因此,8 MB仅略高于RAM总量的1 permille。
答案 1 :(得分:5)
8字节指针的超精度还有其他用途:例如,您可以将引用的类(作为序数索引)编码到指针本身中,从可用的64位中窃取10或20位,为现有的系统留下了足够的空间。
这可以让编译器编写虚拟方法的inline caching,而无需确认实例是预期类型的间接成本。
答案 2 :(得分:4)
实际上,它不会节省内存。内存分配必须根据您分配的内容大小进行调整。例如,一个4字节的内存部分必须放在4的倍数。因此,由于填充对齐5字节指针,它们实际上消耗相同的内存量。
答案 3 :(得分:3)
请记住,实际操作系统不允许您使用物理地址。用户进程始终使用虚拟地址(通常只有内核可以访问物理地址)。处理器将透明地将虚拟地址转换为物理地址。这意味着你可以发现你的程序使用指向虚拟地址的指针足够大,以至于它们没有给定系统的真实地址对应物。它总是发生在32位Windows中,其中DLL被映射到高2GB(虚拟进程地址空间,总是4GB),即使机器具有远低于2GB的内存(实际上它开始发生在PC只有几兆字节时) - 没关系)。 因此,使用“小”指针是无意义的(甚至忽略所有其他因素,即存储器访问,寄存器大小,指令标准操作数大小等),这将仅减少可用的虚拟地址空间。此外,像内存映射文件这样的技术需要“大”指针才能访问可能远远大于可用内存的文件。
答案 4 :(得分:0)
某些多余指针空间的另一个用途是用于存储某些值类型而不需要装箱。我不确定是否需要针对小值类型的通用机制,但当然对所有32位有符号和无符号整数以及所有单精度浮点数进行编码是合理的,并且可能有很多类型的值'long'和'unsigned long'(例如,那些可以用int,unsigned int或float精确表示的那些)。