【问题标题】:big endian and little endian in folly of FacebookFacebook 愚蠢的大端和小端
【发布时间】:2018-02-15 15:13:23
【问题描述】:

看过Facebook创建的folly的代码,在这个页面https://github.com/facebook/folly/blob/master/folly/FBString.h,发现作者在设置一些值的时候考虑了大端和小端,比如容量_,代码如下:

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

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

【问题讨论】:

  • kIsLittleEndian 用于判断大端还是小端

标签: c++ facebook endianness folly


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-12
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多