FBString的最大容量?



对于FBString,max_size()只是返回std::numeric_limits::max()。然而,结构体MediumLargecapacity_的前两位用来表示FBString的类型(small/medium/large),这意味着capacity_的最大值将是2^62-1(64位处理器),它小于size_t的最大值。是我误解了实现还是这实际上是一个bug?

struct MediumLarge {
Char* data_;
size_t size_;
size_t capacity_;
size_t capacity() const {
return kIsLittleEndian ? capacity_ & capacityExtractMask : capacity_ >> 2;
}
void setCapacity(size_t cap, Category cat) {
capacity_ = kIsLittleEndian
? cap | (static_cast<size_t>(cat) << kCategoryShift)
: (cap << 2) | static_cast<size_t>(cat);
}
};

由于folly::FBString的文档声明为:

100%兼容std::string

它实际上似乎是一个错误(在我看来)。

BTW,对于大的字符串,FBString应用写时复制(COW),这也破坏了与std::string的兼容性(从c++ 11开始)。

参见c++ 11中COW std::string实现的合法性。

我猜他们只是不关心那些不切实际的长度的字符串(现在)。由于COW导致的不兼容性可能会更严重。

最新更新