C++ 在C++;64位环境中,是否存在新运算符的结果指针使用全部8个字节的情况?

C++ 在C++;64位环境中,是否存在新运算符的结果指针使用全部8个字节的情况?,c++,pointers,new-operator,C++,Pointers,New Operator,我使用Windows10OS Pc和内置环境调试x64模式。我使用了VisualStudio2019 示例代码 int * d = new int; -记忆- &d is 30 45 0f 2f 12 02 00 00 实际上,在这种情况下,似乎不使用上面的2个字节 是否有一个案例可用于此部分 我正试图在这个空空间(2字节)中放入内存使用计数 在C++ 64位环境中,是否存在新操作符的结果指针使用所有8字节?< /p>的情况。 对于所有64位CPU体系结构,都不能保证指针的某些字节

我使用Windows10OS Pc和内置环境调试x64模式。我使用了VisualStudio2019

示例代码

int * d = new int;
-记忆-

&d is  30 45 0f 2f 12 02 00 00
实际上,在这种情况下,似乎不使用上面的2个字节

是否有一个案例可用于此部分

我正试图在这个空空间(2字节)中放入内存使用计数

<>在C++ 64位环境中,是否存在新操作符的结果指针使用所有8字节?< /p>的情况。 对于所有64位CPU体系结构,都不能保证指针的某些字节不会被使用

在x86-64体系结构的最新实现中,虚拟地址的高16位必须是前一个最高位的副本,地址空间只剩下48位。该规范允许在将来将其扩展到完整的64位(256 TB应该对任何人都足够了……对吧?)

利用CPU架构中“未使用”字节的能力取决于语言实现(操作系统、编译器、消毒剂等)是否已经使用它们

我正试图在这个空空间(2字节)中放入内存使用计数

只要您知道指针的高位字节会限制您的程序对其他操作系统和CPU的可移植性,就可以使用指针的高位字节。考虑一下你是否关心你的程序在10年内仍然有效。

但是,在通过x86-64上的指针进行间接定向之前,必须小心还原高位,即使它们“未使用”(请参见上面的原因)

<>在C++ 64位环境中,是否存在新操作符的结果指针使用所有8字节?< /p>的情况。 :

虚拟地址空间

进程可用的虚拟地址范围称为进程的虚拟地址空间。每个用户模式进程都有自己的私有虚拟地址空间。对于32位进程,虚拟地址空间通常为2 GB的范围0x00000000到0x7FFFFFFF。对于64位Windows上的64位进程,虚拟地址空间是128 TB的范围0x000'00000000到0x7FFF'FFFFFF

从2020年11月2日(链接中指定的日期)起,64位Windows上的整个上2字节似乎都未使用

当然,对系统的任何更新都有可能改变

<>在C++ 64位环境中,是否存在新操作符的结果指针使用所有8字节?< /p>的情况。 正如其他人所解释的,不是在2020年(实际上)。但是,请注意一些潜在问题

  • 这样的标记指针可能会使您的可执行文件变慢(在某些情况下,请进行基准测试),因为每次您想要取消对标记指针的引用时,您都需要在对其进行操作之前做一些事情

  • 您的代码可能会变得可读性差得多,而且将来的贡献者很难对其进行维护

  • 您的代码可能会禁用有趣的编译器优化

  • 您的代码对于其他操作系统(包括Windows或Linux的未来版本)和其他体系结构(例如ARM或PowerPC)的可移植性可能要差得多

  • 您的代码可能不会赢得太多内存空间。指向数据(在C++中,其<代码> sieOS/<代码>)可能有一个以上的单词,特别是当它包含多个多个指针时,因此,您将只赢得RAM的10%(性能会慢一些),因为大多数C++聚合类型(<代码>类<代码> > ES >代码>结构> <代码> -S有一个以上的单词。(只要使用
    virtual
    ,就可能有一个隐藏指针)

  • 您将花费更多的调试工作

我正在尝试将内存使用计数放入这个空白空间(2字节)

  • 您可能会遇到这样的情况,即将溢出您为其使用的16位。因此,您可能需要检查这种情况,这样的运行时检查将使您的可执行文件更慢
所以在你的地方,我会和你的客户或经理讨论这种方法,我不推荐这样做

似乎您想要实现某种粗糙的方法。请务必阅读,因为还有其他方法(特别是),请至少阅读更多关于现有开源实现的内容,并从中获得灵感(例如,或)


考虑阅读与垃圾收集和编程语言实现问题相关的会议论文,例如会议(特别是PLDI).

&d
是指针的地址,而不是它所指向的东西。请您详细说明一下,您正在尝试实现什么?您正在寻找的技术称为指针标记。在x86_64上,您可以将一些数据存储在中,而不存储在中。首先,这是进程内存空间中的虚拟地址,这意味着操作系统可以自由访问第二,它是由OS管理的,而Windows实际上是在X86是一个全新的东西的时候实际使用最旧的位,所以考虑保留它。最后,为什么?为什么要使用2个字节来存储,我假设应该是引用计数器,而有专门的模板叫做SyrdY-PTR呢?此外,您必须意识到会有真正的性能损失,并且每次使用地址时都必须手动操作地址。
这样的标记指针可能会使您的可执行文件变慢……而性能也会变慢。
这是一种过于宽泛的说法。标记指针的使用非常频繁st通常是因为它们可以使程序更快。当然,这是一种折衷,因此在某些情况下,它也可能较慢,并且应该与微不足道的替代方案进行比较。但这几乎适用于所有优化。现代CPU都是内存