diff options
author | Antony Polukhin <antoshkka@gmail.com> | 2021-08-17 13:50:53 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-08-17 16:53:19 +0100 |
commit | 174f9257a75dec93221eca26c236e0a6346c9dfd (patch) | |
tree | 6fc0349205f903bfe82210a028baea03c4ecbe2a | |
parent | 897a15f355632bdc31871554892eca5512b3c370 (diff) | |
download | gcc-174f9257a75dec93221eca26c236e0a6346c9dfd.zip gcc-174f9257a75dec93221eca26c236e0a6346c9dfd.tar.gz gcc-174f9257a75dec93221eca26c236e0a6346c9dfd.tar.bz2 |
libstdc++: Optimize std::seed_seq construction
When std::seed_seq is constructed from random access iterators we can
detect the internal vector size in O(1). Reserving memory for elements
in such cases may avoid multiple memory allocations.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/random.tcc (seed_seq::seed_seq): Reserve capacity
if distance is O(1).
* testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error
line number.
Co-authored-by: Jonathan Wakely <jwakely@redhat.com>
-rw-r--r-- | libstdc++-v3/include/bits/random.tcc | 4 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc | 2 |
2 files changed, 5 insertions, 1 deletions
diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc index 0be50d9..023fded 100644 --- a/libstdc++-v3/include/bits/random.tcc +++ b/libstdc++-v3/include/bits/random.tcc @@ -3240,6 +3240,7 @@ namespace __detail template<typename _IntType, typename> seed_seq::seed_seq(std::initializer_list<_IntType> __il) { + _M_v.reserve(__il.size()); for (auto __iter = __il.begin(); __iter != __il.end(); ++__iter) _M_v.push_back(__detail::__mod<result_type, __detail::_Shift<result_type, 32>::__value>(*__iter)); @@ -3248,6 +3249,9 @@ namespace __detail template<typename _InputIterator> seed_seq::seed_seq(_InputIterator __begin, _InputIterator __end) { + if _GLIBCXX17_CONSTEXPR (__is_random_access_iter<_InputIterator>::value) + _M_v.reserve(std::distance(__begin, __end)); + for (_InputIterator __iter = __begin; __iter != __end; ++__iter) _M_v.push_back(__detail::__mod<result_type, __detail::_Shift<result_type, 32>::__value>(*__iter)); diff --git a/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc b/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc index 8fba714..3ab9c44 100644 --- a/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc +++ b/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc @@ -12,4 +12,4 @@ auto x = std::generate_canonical<std::size_t, // { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 169 } -// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 3352 } +// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 3356 } |