如何在我的程序中设置一个依赖于平台

时间:2017-12-29 12:19:23

标签: c garbage-collection bit-manipulation

我们正在编写一个自动分配和释放内存的程序,换句话说就是垃圾收集器。它应该在64位机器和32位机器上工作,而不必进入并更改代码。这意味着我们的按位函数不能具有例如x << 63,因为这会在32位机器中崩溃。 所以我们需要的是一个在编译程序时设置的常量,它应该是指针的长度或者uintptr_t,它将是4个字节或8个字节长,具体取决于平台并将它们用作初始点。

我希望我的问题很清楚,制定它并不容易。

3 个答案:

答案 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 GCMPS