diff options
author | Mateusz Pusz <mateusz.pusz@gmail.com> | 2017-01-09 19:10:11 +0100 |
---|---|---|
committer | Wouter van Oortmerssen <aardappel@gmail.com> | 2017-01-09 10:10:11 -0800 |
commit | ab7949dc16cf8117616782e9809c5f3653929c05 (patch) | |
tree | 97bcb47bc17d2392db724b962306f4f689587461 | |
parent | 2c4dce5ba768499d7db3e924d9c0ccfcb60e8844 (diff) | |
download | flatbuffers-ab7949dc16cf8117616782e9809c5f3653929c05.tar.gz |
Cold part of make_space() code moved to reallocate member function. (#4130)
Change makes make_space() code much friendlier for the compiler to inline which makes significant (measurable) performance improvements.
-rw-r--r-- | include/flatbuffers/flatbuffers.h | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index aa1d9179..efe2ab11 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -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. |