现在还有必要考虑"BigEnd or LittleEnd"的问题吗?

Is it necessary to consider the "BigEnd or LittleEnd" problem nowadays?

我们都被告知计算机系统有大端和小端之分。但是,几乎我的应用程序都是 运行 x86 和 arm 架构下的,它们都是小端设计的系统。这样一来,是不是总要考虑这个问题? 这让我很困惑何时考虑字节顺序。任何提示或巧妙的建议表示赞赏~

是;网络字节顺序与 x86 等不一致。

从不读取字节 to/from 作为一般规则的序列化作为 memcpy。始终在结构上或数学上重新打包和排列字节。这很烦人,但可以解决字节顺序和许多其他问题。

好的编译器,如果你真的像 memcpy 一样编写它们并且编译器可以证明这一点,就会进行优化。

如果您发现自己使用了任何关于体系结构字节顺序的信息,那么您要么在编写 compiler/standard 库,要么做错了什么。

二进制数据格式 确实有应用程序需要考虑的字节顺序。许多现有的数据格式使用大端表示法。

因此,应用程序通常只处理接口边界的字节顺序。这在理想情况下封装在 htonlntohl 等平台 API 中,但有时这些是 unavailable/unsuitable 并且实现需要提供自己的。它仍然可以完全忽略平台字节序。例如代替

 uint32_t var;
 file.read(&var, sizeof(var));
 #if LITTLE_ENDIAN
     swap_byte_order(var);
 #endif

会写

uint32_t var; byte buf[4];
file.read(buf, sizeof(buf));
var = buf[3] | buf[2]<<8 | buf[1]<<16 | buf[0]<<24;

现代编译器将最后一行编译为 x86 上的单个 bswap 指令。无论体系结构的字节顺序如何,它都能正常工作,因此没有预处理器疯狂,也没有配置问题。

有关详细信息,请阅读 The byte order fallacy