我已经阅读了Facebook创建的愚蠢代码,在https://github.com/facebook/folly/blob/master/folly/FBString.h页面中,发现作者在设置诸如Capacity_之类的值时会考虑大尾数和小尾数,代码如下:

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


我想知道为什么作者应该考虑大尾数法和小尾数法,我认为我们不需要在同一台机器上考虑它们,获取和设置值由机器处理,我们可以忽略它们

最佳答案

该字符串实现在如何根据字符串大小分配内存方面有一些技巧。尤其是here,您可以找到使用联合在策略之间进行交换的位置。

在具有8位字符的64位计算机上,MediumLarge结构的长度为24个字节,可以容纳24个字符。但是,保留最后一个字节的两位来确定存储策略,因此短字符串的长度最多为23个字符。

正是这种“最后一个字节”的事情证明了需要担心字节序的问题:“最后一个字节”是最高地址,因此,在一个小的字节序机器上,这些标志存储在两个最高有效位中,您可以通过屏蔽这两个位来提取容量长度。在big-endian上,最后一个字节是最低有效字节,将标志存储在两个最低有效位中,然后可以通过向右移2位来提取容量。

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

09-13 03:27