【发布时间】:2013-06-21 19:46:34
【问题描述】:
如果运行时检查确认可用的虚拟内存(或 RAM)不超过 4GB,是否有任何平台(如果有,是哪个?)可以执行以下操作?
// 1) cast pointer to void pointer
// 2) cast void pointer to uint64 type
// 3) set most significant bytes of uint64 type to 0 (might be wrong choice)
// 4) store as uint32 type
uint32_t trimmed_pointer = (uint64_t) (void *) pointer & 0x00000000ffffffff;
并取回原来的指针:
same_as_before_t *pointer = (void *) (uint64_t) trimmed_pointer
我意识到这可能是一个可怕的 hack,并且完全取决于操作系统的内存管理器如何实现虚拟内存(以及编译器?),所以我问这个纯粹是出于好奇。
【问题讨论】:
-
好吧,如果操作系统决定虚拟内存总是进入较低的双字,那么这可行,但老实说,我不知道有什么平台可以保证这一点。
-
我可以告诉你,Mac OS X 不能满足你的要求。堆栈变量放置在一个地址上,其中设置了一些高位 32 位(例如 0x7FFF_5468_74DC)。 (示例代码:
#include <stdio.h> #include <inttypes.h> int main(void) { int x; printf("0x%.8" PRIXPTR "\n", (uintptr_t)&x); return 0; } -
是的,这可能会在任何满足这些限制的平台上“工作”......
-
@JonathanLeffler 有趣。我可能会尝试找出 64to32 位掩码在什么平台上可以工作。
-
这个问题背后的动机是什么?
标签: c pointers 64-bit 32bit-64bit virtual-memory