From c261ba2c8b4244128528f964192ca4f4edf1eef5 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Fri, 17 Nov 2017 00:51:20 +0100 Subject: [PATCH] Tweak vector::_M_realloc_insert for code size 2017-11-17 Marc Glisse * include/bits/vector.tcc (vector::_M_realloc_insert): Cache old values before the allocation. From-SVN: r254849 --- libstdc++-v3/ChangeLog | 5 +++++ libstdc++-v3/include/bits/vector.tcc | 13 +++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 4fe0be1a9ea..3c9f3e7569a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2017-11-17 Marc Glisse + + * include/bits/vector.tcc (vector::_M_realloc_insert): Cache old + values before the allocation. + 2017-11-16 Jonathan Wakely * include/std/future (shared_future): Add noexcept to copy constructor diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index f14caaa713f..eadce3c75da 100644 --- a/libstdc++-v3/include/bits/vector.tcc +++ b/libstdc++-v3/include/bits/vector.tcc @@ -421,6 +421,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { const size_type __len = _M_check_len(size_type(1), "vector::_M_realloc_insert"); + pointer __old_start = this->_M_impl._M_start; + pointer __old_finish = this->_M_impl._M_finish; const size_type __elems_before = __position - begin(); pointer __new_start(this->_M_allocate(__len)); pointer __new_finish(__new_start); @@ -442,14 +444,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER __new_finish = std::__uninitialized_move_if_noexcept_a - (this->_M_impl._M_start, __position.base(), + (__old_start, __position.base(), __new_start, _M_get_Tp_allocator()); ++__new_finish; __new_finish = std::__uninitialized_move_if_noexcept_a - (__position.base(), this->_M_impl._M_finish, + (__position.base(), __old_finish, __new_finish, _M_get_Tp_allocator()); } __catch(...) @@ -463,10 +465,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER __throw_exception_again; } _GLIBCXX_ASAN_ANNOTATE_REINIT; - std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, - _M_get_Tp_allocator()); - _M_deallocate(this->_M_impl._M_start, - this->_M_impl._M_end_of_storage - this->_M_impl._M_start); + std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator()); + _M_deallocate(__old_start, + this->_M_impl._M_end_of_storage - __old_start); this->_M_impl._M_start = __new_start; this->_M_impl._M_finish = __new_finish; this->_M_impl._M_end_of_storage = __new_start + __len; -- 2.30.2