我们正在编写一个自动分配和释放内存的程序,换句话说就是垃圾收集器。它应该在64位机器和32位机器上工作,而不必进入并更改代码。这意味着我们的按位函数不能具有例如x << 63
,因为这会在32位机器中崩溃。
所以我们需要的是一个在编译程序时设置的常量,它应该是指针的长度或者uintptr_t
,它将是4个字节或8个字节长,具体取决于平台并将它们用作初始点。
我希望我的问题很清楚,制定它并不容易。
答案 0 :(得分:1)
您是否尝试过预处理器指令?就这样:
#ifdef SYSTEM_32_BITS
int * myPtr = 0x00;
#elseif SYSTEM_64_BITS
long myVal = 0;
#endif
您可以定义一个系统,另一个参数不会编译。这会对你有用吗?
答案 1 :(得分:1)
您可以使用sizeof执行此操作。 E.g:
#include <stdio.h>
#include <stdint.h>
static const size_t ptr_size = sizeof(int*);
static const size_t ptr2_size = sizeof(uintptr_t);
int main() {
printf("int*: %zu\n", ptr_size);
printf("uintptr_t: %zu\n", ptr2_size);
return 0;
}
这将在64位平台上提供以下内容:
int*: 8
uintptr_t: 8
答案 2 :(得分:1)
您可能希望使用<stdint.h>
(及其INTPTR_MAX
)和<limits.h>
。两者都由C11标准规定(见n1570)。您可以使用INTPTR_WIDTH
(和/或{{1}},后者特定于某些实现,如GCC),它们是预处理器常量。
你可以使用一些build automation技巧在构建时自动检测(例如,使用autoconf),如果你有一个64或32位系统(所以用预处理器标志生成一些东西),这是非常的共同。您也可以使用feature_test_macros(7)。
我们正在编写一个垃圾收集器
编写高效的GC可能很困难并且非常耗时(并且通常需要一些编译器和操作系统特定的代码)。您是否考虑过将某些现有库用于GC,例如Boehm GC或MPS?