在MAC上运行的C程序中如何在运行时检查CPU类型

3
一个C程序如何在运行时(而不是编译时)确定它是否在小端或大端CPU上运行?这必须是“运行时”检查,而不是“编译时”检查,因为我正在使用我的Intel CPU的MAC在通用二进制格式下构建程序。这个程序预计将在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()

有没有更好的跨平台方式来实现这个?

谢谢

4个回答

2
不要费心检查;只需在需要网络独立值的地方使用 hton*。通过良好的设计,这应该仅限于模块与需要网络独立整数的程序之间的接口。

对于已经处于网络顺序的大端系统,hton*可能只是一个宏,因此它是免费的。对于小端系统,您仍然需要执行它,因此检查是否需要执行它只会减慢速度。

如果这不足够,请提供更好的解释,说明您试图实现什么以及为什么需要在运行时了解系统的字节序。


1
  • 将会有预处理器宏可用于测试大小端。例如:
   #ifdef LITTLE_ENDIAN
   以小端方式执行
   #else 
   以大端方式执行
   #endif。

这是编译时的操作,但是针对fat二进制文件的源代码将分别为每个架构进行编译,这不是问题。

  • 我不确定macosx是否在sys/endian.h中有betoh64()函数 - 如果有的话 - 使用它会做正确的事情。
  • 最后一种方法是以一种对主机字节顺序不敏感的方式进行单个字节的解包 - 您只需要知道源中字节的顺序即可。

    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;
    }
    

0

你知道在Mac上的通用二进制文件是为每个架构编译多次吗?我想当你谈论编译时间时,你指的是使用configure/make系统来通知源代码...只需使用gcc常量(如LITTLE_ENDIAN)即可。


0

在运行时不需要检查字节序。当您将应用程序编译为通用二进制文件时,它会使用适当的定义和宏进行多次编译,即使您是在 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接