【问题标题】:Max capacity for FBString?FBString 的最大容量?
【发布时间】:2021-12-02 15:44:27
【问题描述】:

对于FBStringmax_size() 只返回 std::numeric_limits::max()。但是struct MediumLargecapacity_的高两位用来表示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);
    }
  };

【问题讨论】:

    标签: c++ string folly


    【解决方案1】:

    因为documentationfolly::FBString 声称是:

    100% 兼容std::string

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

    顺便说一句,对于 字符串,FBString 应用 copy-on-write (COW),这也破坏了与 std::string 的兼容性(自 C++ 11).

    更多详情请见Legality of COW std::string implementation in C++11

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      相关资源
      最近更新 更多