0

我已经阅读了Facebook创建的folly代码,在这个页面https://github.com/facebook/folly/blob/master/folly/FBString.h,我发现作者在设置一些时考虑了big endian和little endian值,如容量_,代码如下:</p>

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

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

4

1 回答 1

1

该字符串实现在如何根据字符串大小分配内存方面有一些聪明之处。值得注意的是,您可以在此处找到联合用于在策略之间进行交换的位置。

在具有 8 位字符的 64 位机器上,MediumLarge 结构的长度为 24 个字节,可以容纳 24 个字符。不过,最后一个字节中的两位保留用于确定存储策略,因此短字符串最长可达 23 个字符。

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

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

于 2017-10-16T15:57:02.750 回答