1

对于FBStringmax_size()只返回std::numeric_limits<size_type>::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);
    }
  };
4

1 回答 1

0

由于声称的文档是:folly::FBString

100% 兼容std::string

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

顺便说一句,对于字符串,FBString应用写时复制(COW),这也破坏了与std::string(自 C++11 起)的兼容性。

有关更多详细信息,请参阅C++11 中 COW std::string 实现的合法性。

我猜他们根本不关心不切实际长度的字符串(现在)。由于 COW 造成的不兼容可能要严重得多。

于 2021-10-14T09:34:13.267 回答