在Facebook的愚蠢中,大恩德尼亚人和小恩迪安

big endian and little endian in folly of Facebook

本文关键字:亚人 Facebook      更新时间:2023-10-16

我读了Facebook创建的愚蠢的代码,在此页面https://github.com/facebook/folly/blob/blob/master/master/folly/fbstring.h,我发现作者考虑了大恩迪安(Big Endian)和小恩迪安(Little Endian),当他设置一些价值时,例如容量_,代码如下:

void setCapacity(size_t cap, Category cat) {
  capacity_ = kIsLittleEndian
      ? cap | (static_cast<size_t>(cat) << kCategoryShift)
      : (cap << 2) | static_cast<size_t>(cat);
}

我想知道为什么作者应该考虑大恩迪安和小恩迪安,我认为我们不需要在同一台机器中考虑它们,机器会处理和结算价值,我们可以忽略它们

该字符串实现在如何根据字符串大小分配内存的方式具有一些聪明。值得注意的是,您可以在这里找到工会在策略之间交换的位置。

在具有8位字符的64位计算机上,中间平台结构长24个字节,可以容纳24个字符。但是,最后一个字节中的两个部分用于确定存储策略,因此短字符串可以长达23个字符。

正是"最后一个字节"的东西证明了需要担心endianness的需要:"最后一个字节"是最高的地址,因此,在一个小的endian机器上,这些标志存储在两个最重要的位置中,您可以通过掩盖这两个位来提取容量长度。在大型字节上,最后一个字节是最不重要的字节,您可以将旗帜存储在两个最不重要的位置中,并且可以通过向右进行2位移动来提取容量。

现在,代码使用kIsLittleEndian和条件操作员在这些行为之间进行交换的事实似乎表明这些检查正在运行时发生。但是,kIsLittleEndian被声明为constexpr,并且可以在编译时评估其所有条件。