首页 > 解决方案 > 在 C++ 64 位环境下,是否存在 new 运算符的结果指针使用全部 8 个字节的情况?

问题描述

我使用 Windows 10 OS Pc 并在环境调试 x64 模式下构建。我使用了 Visual Studio 2019。

示例代码

int * d = new int;

-记忆-

&d is  30 45 0f 2f 12 02 00 00

实际上,在这种情况下,似乎没有使用高 2 个字节。

有没有用到这部分的案例?

我试图在这个空白空间(2字节)中放置一个内存使用计数。

标签: c++pointersnew-operator

解决方案


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

没有一般保证适用于所有 64 位 CPU 架构,即指针的某些字节将未被使用。

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

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

我试图在这个空白空间(2字节)中放置一个内存使用计数。

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

但是,在通过 x86-64 上的指针间接之前,您必须小心恢复高位,即使它们“未使用”(参见上面的原因)。


推荐阅读