gpt4 book ai didi

c++ - Facebook 愚蠢的大端和小端

转载 作者:行者123 更新时间:2023-11-28 05:00:46 26 4
gpt4 key购买 nike

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

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

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

最佳答案

该字符串实现在如何根据字符串大小分配内存方面有一些巧妙之处。特别是 here您可以找到 union 用于在策略之间交换的位置。

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

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

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

关于c++ - Facebook 愚蠢的大端和小端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46086901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com