【发布时间】:2014-11-26 05:09:16
【问题描述】:
我正在使用技巧将额外信息存储在指针中,目前指针中未使用某些位(最高 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++ 需要该解决方案,最好是可以在编译时完成的解决方案。 其他平台的解决方案也很有趣,但不会标记为正确答案。
【问题讨论】:
-
目前我在调试模式下断言检查从 malloc 返回的指针是否使用不超过 48 位,但这些断言在发布时被关闭。我想要一个在启动或编译时进行检查的解决方案。
-
如果您想对处理器功能进行编译时测试,请使用 cpuid 80000008H,请参阅英特尔手册。
-
您的应用程序需要多少内存?小于 2GB?
-
“最好是可以在编译时完成的东西” - 所以你知道你将只在你编译的计算机上运行吗?来自wikipedia“当前实现中使用了 48 位”/“架构定义允许在未来的实现中将此限制提高到完整的 64 位”,因此您使用的任何 hack 都可能在以后的硬件/操作系统上中断。您关心的只是
new-ed 内存,还是必须支持指向局部和全局变量、共享内存、malloc-ed 内存等的指针?无论如何,您使用的 编译器 是必不可少的信息。 -
@Deduplicator 我需要超过 2GB(但目前小于 256TB)。时间查看有关 cpuid 指令的 intels 文档。
标签: c++ windows pointers 64-bit