【问题标题】:Check if app is built in 32 or 64-bit?检查应用是 32 位还是 64 位构建的?
【发布时间】:2013-09-27 06:17:22
【问题描述】:

如何检查我的应用是编译成 32 位还是 64 位?

这有助于调试低级代码(例如使用缓冲区)。

【问题讨论】:

  • 为什么需要知道?无论哪种方式,正确编写的代码都应该可以正常工作。
  • 我同意@dpassage。虽然如果您需要知道检查设备型号。 developer.apple.com/library/ios/documentation/uikit/reference/…
  • @dpassage 非常幼稚的评论。对于简单的事情是正确的,但绝对不是,当您想针对不同的 CPU 架构优化代码时。
  • 这不太对,因为据我了解,iPhone 5S 仍将运行 32 位应用程序。
  • 在大多数情况下,几乎不需要对 64 位处理器进行“优化”,尤其是在像 Objective-C 这样不可能进行内联的动态类型的面向对象语言中。您需要这样的检查的唯一原因是为了严肃的数学(它更适合 Accelerate 或 NEON),或者定义与架构无关的类型,这些类型在大多数语言的 STL 中都得到了很好的体现。跨度>

标签: iphone ios


【解决方案1】:

编译时检查将涉及#ifdef'ing for __LP64__,这是 ARM 的数据类型大小标准。运行时解决方案将涉及检查指针的大小,如下所示:

if (sizeof(void*) == 4) {
    // Executing in a 32-bit environment
} else if (sizeof(void*) == 8) {
   // Executing in a 64-bit environment
}

值得庆幸的是,指针大小是编译 64 位代码的不同标准似乎一致的一件事。

【讨论】:

  • 仅供参考,__LP64__sizeof() 解决方案都是编译时的。评估 sizeof 是编译过程的一部分,而不是函数。编译器基本上将 sizeof(type) 替换为您正在编译的系统上该类型的大小。理想情况下,#ifdef 和 if/else 最终会以相同的方式编译,因为编译器会看到 8 始终 == 8 并优化 8 == 4 分支。
  • 从技术上讲,您是正确的(但您的论点是基于优化编译器的假设)。或许this 更适合“运行时检查”的更严格定义。
【解决方案2】:
#ifdef __LP64__
    NSLog(@"64-bit\t");
#else
    NSLog(@"32-bit\t");
#endif

【讨论】:

  • 这个编译时间。问题是针对运行时的。
【解决方案3】:

您可以检查指针的大小。我认为在 32 位上是 4 字节,在 64 上应该是 8。

if( sizeof(void*) == 4 ) then 32bit else 64bit

【讨论】:

  • int 在 64 位中保持 4 个字节。
  • 哦,真难过,可以试试 sizeof(void)
  • 你应该用 NSInteger 试试这个。 “在构建 32 位应用程序时,NSInteger 是 32 位整数。64 位应用程序将 NSInteger 视为 64 位整数。”
  • @LeoNatan 最后,我可以认为 sizeof(void*) 是最好的选择吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2017-08-01
  • 2010-11-03
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多