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.
This commit is contained in:
parent
2c4dce5ba7
commit
ab7949dc16
|
@ -539,17 +539,7 @@ class vector_downward {
|
||||||
|
|
||||||
uint8_t *make_space(size_t len) {
|
uint8_t *make_space(size_t len) {
|
||||||
if (len > static_cast<size_t>(cur_ - buf_)) {
|
if (len > static_cast<size_t>(cur_ - buf_)) {
|
||||||
auto old_size = size();
|
reallocate(len);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
cur_ -= len;
|
cur_ -= len;
|
||||||
// Beyond this, signed offsets may not have enough range:
|
// Beyond this, signed offsets may not have enough range:
|
||||||
|
@ -593,6 +583,20 @@ class vector_downward {
|
||||||
uint8_t *buf_;
|
uint8_t *buf_;
|
||||||
uint8_t *cur_; // Points at location between empty (below) and used (above).
|
uint8_t *cur_; // Points at location between empty (below) and used (above).
|
||||||
const simple_allocator &allocator_;
|
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.
|
// Converts a Field ID to a virtual table offset.
|
||||||
|
|
Loading…
Reference in New Issue