message: Cold part of make_space() code moved to reallocate member function.
  Change makes make_space() code much friendlier for the compiler to inline which makes significant (measurable) performance improvements.
diff: @@ -539,17 +539,7 @@ class vector_downward {
  uint8_t *make_space(size_t len) {
  if (len > static_cast<size_t>(cur_ - buf_)) {
  - auto old_size = size();
  - auto largest_align = AlignOf<largest_scalar_t>();
  - reserved_ += (std::max)(len, growth_policy(reserved_));
  - // Round up to avoid undefined behavior from unaligned loads and stores.
  - reserved_ = (reserved_ + (largest_align - 1)) & ~(largest_align - 1);
  - auto new_buf = allocator_.allocate(reserved_);
  - auto new_cur = new_buf + reserved_ - old_size;
  - memcpy(new_cur, cur_, old_size);
  - cur_ = new_cur;
  - allocator_.deallocate(buf_);
  - buf_ = new_buf;
  + reallocate(len);
  }
  cur_ -= len;
  // Beyond this, signed offsets may not have enough range:
  @@ -593,6 +583,20 @@ class vector_downward {
  uint8_t *buf_;
  uint8_t *cur_; // Points at location between empty (below) and used (above).
  const simple_allocator &allocator_;
  +
  + void reallocate(size_t len) {
  + auto old_size = size();
  + auto largest_align = AlignOf<largest_scalar_t>();
  + reserved_ += (std::max)(len, growth_policy(reserved_));
  + // Round up to avoid undefined behavior from unaligned loads and stores.
  + reserved_ = (reserved_ + (largest_align - 1)) & ~(largest_align - 1);
  + auto new_buf = allocator_.allocate(reserved_);
  + auto new_cur = new_buf + reserved_ - old_size;
  + memcpy(new_cur, cur_, old_size);
  + cur_ = new_cur;
  + allocator_.deallocate(buf_);
  + buf_ = new_buf;
  + }
  };
  // Converts a Field ID to a virtual table offset.
  