aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Polukhin <antoshkka@gmail.com>2021-08-17 13:50:53 +0100
committerJonathan Wakely <jwakely@redhat.com>2021-08-17 16:53:19 +0100
commit174f9257a75dec93221eca26c236e0a6346c9dfd (patch)
tree6fc0349205f903bfe82210a028baea03c4ecbe2a
parent897a15f355632bdc31871554892eca5512b3c370 (diff)
downloadgcc-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.tcc4
-rw-r--r--libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc2
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 }