【问题标题】:check CPU type at RUN time for C program on MAC在运行时检查 MAC 上 C 程序的 CPU 类型
【发布时间】:2009-12-02 17:09:04
【问题描述】:

C 程序如何在运行时(不是编译时)确定, 它是在 Little-Endian 还是 Big-Endian CPU 上运行?

之所以必须是“运行时”检查,而不是“编译时”,是因为我正在使用带有 Intel-CPU 的 MAC 以 MAC OSX 的通用二进制格式构建程序。该程序预计可在 Intel 和 Power-PC CPU 上运行。即通过MAC上的通用二进制格式,我想用Intel-CPU构建一个程序并在PPC CPU下运行。

我的程序中需要 CPU 检查的逻辑是 64 位整数的主机到网络字节顺序更改函数。现在我让它盲目地交换字节顺序,这在 Intel-CPU 上工作正常,但在 PPC 上中断。这是 C 函数:

unsigned long long
hton64b (const unsigned long long h64bits) {
   // Low-order 32 bits in front, followed by high-order 32 bits.
   return (
       (
        (unsigned long long)
        ( htonl((unsigned long) (h64bits & 0xFFFFFFFF)) )
       ) << 32
      )
      |
      (
       htonl((unsigned long) (((h64bits) >> 32) & 0xFFFFFFFF))
      );
}; // hton64b()

有更好的跨平台方式吗?

谢谢

【问题讨论】:

    标签: macos universal-binary endianness


    【解决方案1】:

    不要费心检查;只需在需要独立于网络的值的地方使用 hton* 即可。有了好的设计,它应该被限制在你的程序之间的接口模块和任何需要网络独立整数的模块。

    在已经按网络顺序排列的大端系统上,hton* 可能只是一个宏,所以它是免费的。在 little-endian 系统上,无论如何您都需要这样做,因此检查是否需要这样做只会减慢您的速度。

    如果这还不够,那么您需要更好地解释您要完成的工作以及为什么需要在运行时了解系统的字节序。

    【讨论】:

      【解决方案2】:
      • 会有预处理器宏 可用于测试它是否 大/小端。例如
      #ifdef LITTLE_ENDIAN 做小端方式 #别的 做大端的方式 #万一。

      这是编译时,但是fat的来源 二进制文件被单独编译 每个架构,这不是一个 问题。

      • 我不确定 macosx 是否有 sys/endian.h 中的 betoh64() 函数 - 如果确实如此 - 使用它会做 正确的事情。
      • 最后一种方法是简单地做 拆包中的各个字节 一种对主人不明智的方式 endian - 你只需要知道 顺序字节是从 来源。

        uint64_t unpack64(uint8_t *src)
        {
           uint64_t val;
        
           val  = (uint64_t)src[0] << 56;
           val |= (uint64_t)src[1] << 48;
           val |= (uint64_t)src[2] << 40;
           val |= (uint64_t)src[3] << 32;
           val |= (uint64_t)src[4] << 24;
           val |= (uint64_t)src[5] << 16;
           val |= (uint64_t)src[6] <<  8;
           val |= (uint64_t)src[7]      ;
        
           return val;
        }
        

      【讨论】:

        【解决方案3】:

        您是否意识到 Mac 上的通用二进制文件被编译多次,每个架构一次编译?我想当您谈论编译时间时,您指的是使用您的配置/制作系统来通知源......只需使用 gcc 常量(如 LITTLE_ENDIAN )

        【讨论】:

          【解决方案4】:

          您无需在运行时检查字节顺序。当您将应用程序编译为通用二进制文件时,它会使用适当的定义和宏进行多次编译,即使您是在 Intel 机器上构建的。在运行时,mach-o 加载器将从您的通用二进制文件(即 PowerPC 上的 ppc 或 Intel 上的 i386)中选择最佳架构来运行。

          通用二进制并不意味着一个二进制用于多种架构。这意味着一个胖二进制文件包含一个用于一种架构的二进制文件。

          详情请咨询http://developer.apple.com/legacy/mac/library/documentation/MacOSX/Conceptual/universal_binary/universal_binary_intro/universal_binary_intro.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-06-13
            • 2018-09-29
            • 2016-05-16
            • 2013-11-02
            • 2021-08-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多