c++ - 在 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++ 64 位环境下,是否存在 new 运算符的结果指针使用全部 8 个字节的情况?
没有一般保证适用于所有 64 位 CPU 架构,即指针的某些字节将未被使用。
在x86-64 体系结构的最新实现中,虚拟地址的高 16 位必须是最高前位的副本,只留下 48 位用于地址空间。该规范允许将来将其扩展到完整的 64 位(尽管 256 TB对任何人来说都应该足够了……对吧?)。
利用 CPU 架构中“未使用”字节的能力取决于语言实现(操作系统、编译器、消毒剂……)是否已经使用它们。
我试图在这个空白空间(2字节)中放置一个内存使用计数。
只要您知道它会限制您的程序对其他操作系统和 CPU 的可移植性,就可以使用指针的高字节。考虑一下您是否关心您的程序在 10 年后是否仍然有效。
但是,在通过 x86-64 上的指针间接之前,您必须小心恢复高位,即使它们“未使用”(参见上面的原因)。
推荐阅读
- javascript - 如何用花括号包裹 json 的值?
- json - 将json解组到结构时如何不允许空字段
- jquery - 在 Node.js 中抓取 HTML 列表
- r - 如何将连续变量转换为r中的分类变量
- google-apps-script - 如何根据填充的单元格填充缺失的数据
- java - 你能把数组放到Java中的业务方法中吗
- r - 从不同列中的先前行计算列值
- python - 无法使用 selenium 将所需的键发送到下拉列表
- google-sheets - 如何比较一列中的两个单元格并查看它们是否在另一列中共享共同属性?
- r - model.frame.default 中的错误:运行方差分析时可变长度不同