【问题标题】:C++, function that checks if software runs on 32-bit or 64-bit systemC++,检查软件是否在 32 位或 64 位系统上运行的函数
【发布时间】:2012-04-30 23:15:33
【问题描述】:

正如我在许多问题中所解释的,我正在尝试将软件从 32 位系统迁移到 64 位系统。 我有some problem with malloc() function,但现在我通过更正一个参数来解决它。

在我的那部分代码中,如果我在 32 位系统上运行,我可以使用:

(int**) malloc (const * sizeof(int))

但是,在 64 位系统上,我必须使用:

(int**) malloc (const * sizeof(int64_t))

我想用 if() 条件管理这些十字路口,所以我需要一个 boolean isIt64system() 函数以这种方式运行:

if(isIt64system()) then [64位码]

其他 [32 位代码]

这个函数是否存在于 C++ 中? 是否有任何功能可以告诉我软件是在 32 位系统还是 64 位系统上运行?

【问题讨论】:

  • 所以你的意思是说你在两个不同的平台上运行同一个二进制文件?
  • 正确的做法是(int**) malloc (count * sizeof(int*)),或者更好的new int*[count]
  • 您似乎将主机操作系统与应用程序的构建方式混淆了。您不能在运行时重新定义 malloc。它必须编译为 32 位或 64 位,在任何一种情况下,它都将采用 size_t 类型的参数。在 PC 平台上,如果编译为 32 位,size_t 将为 32 位宽,如果编译为 64 位,则为 64 位。无法在运行时更改它。
  • @Henrik:甚至更好地使用向量;)

标签: c++ visual-studio-2008 32bit-64bit 32-bit


【解决方案1】:

与其编写两个依赖于大小的分支,不如编写一个正确的、可移植的代码路径。在你的情况下:

(int**)malloc(count*sizeof(int*));

无论您的系统上int* 的大小如何,这都能正常工作。


后记:正如您从这个问题的字面答案中看到的那样,您最好不要使用 if:
if(sizeof(int*) == sizeof(int))
    x = (int**)malloc(count*sizeof(int));
else if (sizeof(int*) == sizeof(int64_t))
    x = (int**)malloc(count*sizeof(int64_t));

希望您能看到该代码是多么荒谬的冗余,以及应该如何将其替换为一个构造良好的 malloc 调用。

【讨论】:

  • 谢谢。其他解决方案new int*[count] 会一样吗?
  • 该解决方案也是正确的,并且更适合 C++ 程序。请注意,任何用new[] 分配的指针必须用delete[] 释放,任何用malloc() 分配的指针必须用free() 释放。
【解决方案2】:

您的编译器将具有预处理器定义,可让您检查 32 位与 64 位。

【讨论】:

    【解决方案3】:

    最好是使用这样的东西

    #ifdef __LP64__
        <64bit code>
    #else
        <32bit code>
    #endif
    

    但如果你真的需要一个函数,那么这应该可以工作。

    bool is64bit() {
        if (sizeof(int*) == 4) {
            return false;
        }
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2012-06-12
      • 2011-08-23
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多