FBString 的最大容量?
Max capacity for FBString?
对于 FBString、max_size() 只需 returns std::numeric_limits::max() 。而struct MediumLarge中capacity_的高两位用来表示FBString(small/medium/large)的类型,即capacity_ 的最大值将为 2^62-1(64 位处理器),它小于 size_t 的最大值。是我误解了实现还是这实际上是一个错误?
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
的 documentation 声称是:
100% compatible with std::string
它实际上似乎是一个错误(在我看来)。
顺便说一句,对于 large 字符串,FBString
应用 copy-on-write (COW),这也打破了与 std::string
(C++11 起).
的兼容性
有关详细信息,请参阅 Legality of COW std::string implementation in C++11。
我猜他们根本不关心不切实际长度的字符串(现在)。由于 COW 导致的不兼容可能会严重得多。
对于 FBString、max_size() 只需 returns std::numeric_limits
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
的 documentation 声称是:
100% compatible with
std::string
它实际上似乎是一个错误(在我看来)。
顺便说一句,对于 large 字符串,FBString
应用 copy-on-write (COW),这也打破了与 std::string
(C++11 起).
有关详细信息,请参阅 Legality of COW std::string implementation in C++11。
我猜他们根本不关心不切实际长度的字符串(现在)。由于 COW 导致的不兼容可能会严重得多。