https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110287
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- Do you mean something like this? diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 70ced3d101f..a4dbfeb8b5b 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -1902,6 +1902,21 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER return (__len < size() || __len > max_size()) ? max_size() : __len; } + // Called by _M_insert_aux etc. + _GLIBCXX20_CONSTEXPR + size_type + _M_check_len_1(const char* __s) const + { + if (__builtin_constant_p(size())) + { + if (size() == 0) + return 1; + else if (size() < max_size() / 2) + return size() * 2; + } + return _M_check_len(1, __s); + } + // Called by constructors to check initial size. static _GLIBCXX20_CONSTEXPR size_type _S_check_init_len(size_type __n, const allocator_type& __a) diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index acd11e2dc68..1f0b3123c3b 100644 --- a/libstdc++-v3/include/bits/vector.tcc +++ b/libstdc++-v3/include/bits/vector.tcc @@ -458,8 +458,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _M_realloc_insert(iterator __position, const _Tp& __x) #endif { - const size_type __len = - _M_check_len(size_type(1), "vector::_M_realloc_insert"); + const size_type __len = _M_check_len_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(); @@ -946,7 +945,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER else { const size_type __len = - _M_check_len(size_type(1), "vector<bool>::_M_insert_aux"); + _M_check_len_1("vector<bool>::_M_insert_aux"); _Bit_pointer __q = this->_M_allocate(__len); iterator __start(std::__addressof(*__q), 0); iterator __i = _M_copy_aligned(begin(), __position, __start);