c++ - 如何确定我们使用的是真正的 48、56 还是 64 位指针

标签 c++ windows pointers 64-bit

我正在使用一些技巧在指针中存储额外的信息,目前有些位没有在指针中使用(最高 16 位),但这在未来会改变。我希望有一种方法来检测我们是否正在编译或运行在将使用超过 48 位的指针的平台上。

相关内容: Why can't OS use entire 64-bits for addressing? Why only the 48-bits? http://developer.amd.com/wordpress/media/2012/10/24593_APM_v2.pdf

x86-64、Windows、C/C++ 需要解决方案,最好是可以在编译时完成的解决方案。 其他平台的解决方案也很有趣,但不会标记为正确答案。

最佳答案

Windows has exactly one switch for 32bit and 64bit programs to determine the top of their virtual-address-space :

IMAGE_FILE_LARGE_ADDRESS_AWARE

对于这两种类型,省略它会将程序限制在较低的 2 GB 地址空间,严重减少应用程序可以映射的内存,从而降低地址空间布局随机化(ASLR,一种攻击缓解机制)的有效性).

不过它有一个好处,这正是您想要的:只能设置指针的低 31 位,因此可以通过 int (32位整数、符号或零扩展)。


在运行时情况稍微好一些:

只需使用来自 intel 的 cpuid 指令,函数 EAX=80000008H,并从位 8-15 读取虚拟地址的最大使用地址位数。

操作系统不能使用超过 CPU 支持的数量,请记住英特尔坚持规范地址(符号扩展)。

请参阅此处了解如何使用 C++ 中的 cpuid:CPUID implementations in C++

关于c++ - 如何确定我们使用的是真正的 48、56 还是 64 位指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140029/

相关文章:

c++ - 堆栈溢出或指针错误?

c# - UWP在启动时启动后台任务

c - Windows - 程序使用了多少内存没有意义

c - 结构类型数组,C错误

c - 为什么在函数中更改数组会影响原始数组?

c++ - *++*++ppp, *++pp[1], *++(*(1+ppp) 有什么具体区别吗?(C/C++指针问题)

接受 int 并打印 * 的 C++ 程序

c++ - "stat"函数更新慢?

c++ - C++:静态断言参数包与函数类型匹配

java - 32 位 DLL 导致 UnsatisfiedLinkError