我已经阅读了Facebook创建的愚蠢代码,在这个页面https://github.com/facebook/folly/blob/master/folly/FBString.h中,我发现作者在设置一些值时会考虑big endian和little endian,例如capacity_,代码如下:< / p>
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,我认为我们不需要在同一台机器上考虑它们,geting和setup值由机器处理,我们可以忽略它们< / p>
答案 0 :(得分:1)
该字符串实现在如何根据字符串大小分配内存方面有一些巧妙。值得注意的是here你可以找到一个联盟用来在策略之间交换的地方。
在具有8位字符的64位计算机上,MediumLarge结构长度为24个字节,可以容纳24个字符。但是,保留最后一个字节的两位用于确定存储策略,因此短字符串最长可达23个字符。
&#34;最后一个字节&#34;有理由需要担心字节序的事情:那个&#34;最后一个字节&#34;是最高地址,因此,在一个小端机器上,这些标志存储在两个最高有效位中,您可以通过屏蔽这两个位来提取容量长度。在big-endian上,最后一个字节是最低有效字节,将标志存储在两个最低有效位中,并且可以通过向右移动2位来提取容量。
现在,代码使用kIsLittleEndian
和条件运算符在这些行为之间进行交换这一事实似乎表明这些检查是在运行时进行的。但是,kIsLittleEndian
被声明为constexpr
,并且可以在编译时评估其上的所有条件。