c++ - 在运行时检测字节序有什么好处?

标签 c++ endianness

我已经搜索了宏来确定机器上的字节顺序,但没有找到任何标准的处理器宏,但有很多解决方案在运行时这样做。 为什么我应该在运行时检测字节顺序?

如果我这样做:

#ifdef LITTLE_ENDIAN
  inline int swap(int& x) {
    // do swap anyhow
    return swapped;
  }
#elif BIG_ENDIAN
  inline int& swap(int& x) { return x; }
#else
  #error "some blabla"
#endif

int main() {
  int x = 0x1234;
  int y = swap(x);

  return 0;
}

编译器只会生成一个函数。

但如果我这样做(参见 predef.endian ):

enum {
  ENDIAN_UNKNOWN,
  ENDIAN_BIG,
  ENDIAN_LITTLE,
  ENDIAN_BIG_WORD,   /* Middle-endian, Honeywell 316 style */
  ENDIAN_LITTLE_WORD /* Middle-endian, PDP-11 style */
};

int endianness(void)
{
  uint8_t buffer[4];

  buffer[0] = 0x00;
  buffer[1] = 0x01;
  buffer[2] = 0x02;
  buffer[3] = 0x03;

  switch (*((uint32_t *)buffer)) {
  case 0x00010203: return ENDIAN_BIG;
  case 0x03020100: return ENDIAN_LITTLE;
  case 0x02030001: return ENDIAN_BIG_WORD;
  case 0x01000302: return ENDIAN_LITTLE_WORD;
  default:         return ENDIAN_UNKNOWN;
}


int swap(int& x) {
  switch(endianess()) {
    case ENDIAN_BIG:
      return x;
    break;
    case LITTLE_ENDIAN:
      // do swap
      return swapped;
    break;
    default:
      // error blabla
  }
  // do swap anyhow
}

编译器生成检测代码。

我不明白,我为什么要这样做?

如果我有代码,为小端机器编译,整个代码是为小端生成的,如果我尝试在大端机器上运行这样的代码(在像 arm wiki:bi-endian 这样的双端机器上)整个代码是为小端机器编译的。所以所有其他声明,例如int 也是 le。

// compiled on little endian
uint32_t 0x1234;  // 0x1234 constant literal
// should result 34120000 on BE

最佳答案

实际上在某些系统中,SOFTWARE 可以设置系统是(当前运行在)little endian 模式还是 big endian 模式。大多数系统只支持在特殊情况下切换,而不是(幸运的是系统程序员等)任意来回切换。但是支持可执行文件定义该特定可执行文件是在 LE 还是 BE 模式下运行是可以想象的。在那种情况下,您不能依赖于挑选出它是什么操作系统和处理器型号......

另一方面,如果硬件只支持一种字节顺序(例如不同形式的 x86),那么我认为没有必要在运行时进行检查。你知道它是小端字节序,仅此而已。让系统包含代码来检查它是哪种字节顺序,并携带转换方法以从大端转换为小端,这是一种浪费(就性能和代码大小而言)。

关于c++ - 在运行时检测字节序有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16109501/

相关文章:

c++ - ant cpptask 与 ivy

c++ - 循环替换模板

c++ - C memcpy 以小字节序复制字节

c++ - constexpr 中的字节顺序

c++ - 两个给定整数之间的质数

c++ - 动态创建一个新的 protobuf 消息

c++ - cout在OpenCL HelloWorld问题中未在控制台或输出缓冲区上显示char数组(char buf)

c# - System.Numerics.Vectors 提供关于大小和位顺序的哪些保证?

c - C 中的字节顺序和套接字编程

java - 将数据存储到 Cassandra 时是大端还是小端?