【问题标题】:Simplest way to determine if current assembly is 32/64bit within the code确定代码中当前程序集是否为 32/64 位的最简单方法
【发布时间】:2019-06-25 10:51:54
【问题描述】:

我想知道确定当前程序集(特别是:以编程方式检查程序本身)是 32 位还是 64 位代码的最简单方法是什么。

当前示例:我正在 Windows/VS 上构建一个 C++ 应用程序,该应用程序构建为 x86 和 x64 可执行文件并单独分发。

在程序中有一个例程,我必须检查当前正在运行的版本(程序必须知道它自己的目标,可以这么说)。

我开始对 Win32 API 的大量调用发疯了,但所有这些都非常繁琐,基本上只是反映了操作系统如何执行程序。我确定必须有一种我不知道的更优雅的方式?您将如何处理?

谢谢!

【问题讨论】:

  • 如果是您的代码,您必须知道它是如何构建的,并且可以在代码中设置某种标志。
  • 您可以查看sizeof(int*)
  • @NeilButterworth 你是对的,因为这将是一个简单的选择 - 但是我正在寻找一种通用的方式作为检查(意思是:两个平台构建的代码相同)
  • 相关,可能重复:stackoverflow.com/q/1505582/1896169
  • @loopend 在这种情况下,仅检测您的应用程序是否作为 32 位构建运行是不够的。由于 64 位系统可以运行 32 位应用程序,因此您需要检测您的应用程序是专门作为 64 位系统(在 WOW64 模拟器内)上的 32 位进程运行还是在 32 位系统上作为 32 位进程本机运行。使用IsWow64Process() 进行检查。

标签: c++ architecture .net-assembly 32bit-64bit wow64


【解决方案1】:
template<std::size_t n>
constexpr bool Am_I_bit(){
  return (sizeof(void*)*CHAR_BIT)==n;
}

constexpr bool I_am_32_bit(){
  return Am_I_bit<32>();
}

constexpr bool I_am_64_bit(){
  return Am_I_bit<64>();
}

在一些非常晦涩难懂的平台上会失败,但你不是在构建这些平台。

【讨论】:

  • 谢谢,这似乎足够可靠!
  • 64 位模式下的 ILP32 ABI 是失败的一种情况。 Linux x32 用于 x86-64,AArch64-ILP32
【解决方案2】:
inline bool is_32bit () { return sizeof (void *) <= 4; )

我认为不需要所有这些模板——如果你把它放在头文件中,它无论如何都会被内联。

【讨论】:

  • 您需要将其声明为inline 以将其放在标题中,但是是的,这很好。具有 32 位 char 的 32 位字可寻址 DSP 架构将具有 sizeof(void*) == 1,但这很好,除非您需要将任何具有 32 位字的 64 位 DSP 架构检测为 64 位。跨度>
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多