为什么条件字节顺序不好?

Why conditional byte order is bad?

Linus 声称[12] 条件字节顺序比愚蠢的更糟糕

我首先想到的是ZFS,但肯定还有其他例子。

他写道:

The only sane model is to specify one fixed byte order. Seriously. It's equally portable, it generates better code - even on architectures that then have to unconditionally do byte order swapping - and it's simpler to add static type checks for etc. It's literally less code and faster to do a "bswap" instruction than to do a conditional test of some variable (even if you can then avoid the bswap dynamically)

我认为条件字节顺序可能会生成更长的代码,但在使用相同字节顺序的机器上它应该更快。似乎他的大部分观点都是关于代码美学的。我不是专家所以,我想看看他的观点更详细的解释。

您要求对 Linus 的主张进行解释。你误以为它们是关于美学的。

当 Linus 说“[固定字节顺序] 生成更好的代码”时,他主要是在谈论更好(即更快)机器代码

当他说"it's simpler to add static type checks for etc."时,他可能在谈论C源代码,但这不是审美问题。更简单的代码更容易理解、更容易维护,并且出现错误的面积更小。通常(但不总是)它还会生成更好的机器代码。

当他说是 "faster to do a 'bswap' instruction than to do a conditional test of some variable" 时,他又在谈论机器代码,基本上是说 能够 以本机顺序获取数据对你没有好处,性能- 明智的,如果你不能 依赖 数据是按本机顺序排列的。他声称,能够依赖数据处于 错误的 顺序比在使用之前必须测试它的顺序要好。

Linus 认为,即使协议选择的字节顺序与机器的本机字节顺序不同,上述所有内容也适用。在那次谈话的其他地方,他和其他人观察到,即使数据不是按本机字节顺序排列的,您也可以对其执行许多不关心字节顺序的操作。此外,如果您事先知道字节顺序是什么,那么对于其他一些操作,可以在编译时以一种避免 运行 时间字节交换的方式调整该顺序。

Linus 的论点很有说服力。