aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2018-07-26 12:01:14 +0000
committerMarc Glisse <marc.glisse@inria.fr>2018-07-26 12:01:14 +0000
commitc63ffd8cac7ad717ab84254a1faa418ddcb95ea1 (patch)
treed4eca073a640be7741bd0f6c125e5ff0df6da5ec
parenta36303ddba36adbee42b524f8f4ab4fb4f9c84ad (diff)
optimize std::vector move assignment
2018-07-26 Marc Glisse <marc.glisse@inria.fr> * include/bits/stl_vector.h (_Vector_impl_data::_M_copy_data): New. (_Vector_impl_data::_M_swap_data): Use _M_copy_data. (vector::_M_move_assign): Reorder the swaps. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@262998 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/include/bits/stl_vector.h19
2 files changed, 21 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 050b027fbe5..9704fd60149 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-26 Marc Glisse <marc.glisse@inria.fr>
+
+ * include/bits/stl_vector.h (_Vector_impl_data::_M_copy_data): New.
+ (_Vector_impl_data::_M_swap_data): Use _M_copy_data.
+ (vector::_M_move_assign): Reorder the swaps.
+
2018-07-26 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/86676
diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h
index d2be98883b3..424971a02f2 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -103,11 +103,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
#endif
void
+ _M_copy_data(_Vector_impl_data const& __x) _GLIBCXX_NOEXCEPT
+ {
+ _M_start = __x._M_start;
+ _M_finish = __x._M_finish;
+ _M_end_of_storage = __x._M_end_of_storage;
+ }
+
+ void
_M_swap_data(_Vector_impl_data& __x) _GLIBCXX_NOEXCEPT
{
- std::swap(_M_start, __x._M_start);
- std::swap(_M_finish, __x._M_finish);
- std::swap(_M_end_of_storage, __x._M_end_of_storage);
+ // Do not use std::swap(_M_start, __x._M_start), etc as it loses
+ // information used by TBAA.
+ _Vector_impl_data __tmp;
+ __tmp._M_copy_data(*this);
+ _M_copy_data(__x);
+ __x._M_copy_data(__tmp);
}
};
@@ -1731,8 +1742,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_move_assign(vector&& __x, true_type) noexcept
{
vector __tmp(get_allocator());
- this->_M_impl._M_swap_data(__tmp._M_impl);
this->_M_impl._M_swap_data(__x._M_impl);
+ __tmp._M_impl._M_swap_data(__x._M_impl);
std::__alloc_on_move(_M_get_Tp_allocator(), __x._M_get_Tp_allocator());
}