aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2021-08-17 11:30:56 +0100
committerJonathan Wakely <jwakely@redhat.com>2021-08-17 14:22:50 +0100
commit0808b0df9c4d31f4c362b9c85fb538b6aafcb517 (patch)
treefbf9bc63af60b82ece376b9c2d7ed612e3a08ad8
parent3b3f2f7c265ef9f176cb811a8049b24538d954d9 (diff)
downloadgcc-0808b0df9c4d31f4c362b9c85fb538b6aafcb517.zip
gcc-0808b0df9c4d31f4c362b9c85fb538b6aafcb517.tar.gz
gcc-0808b0df9c4d31f4c362b9c85fb538b6aafcb517.tar.bz2
libstdc++: Optimize std::function move constructor [PR101923]
PR 101923 points out that the unconditional swap in the std::function move constructor makes it slower than copying an empty std::function. The copy constructor has to check for the empty case before doing anything, and that makes it very fast for the empty case. Adding the same check to the move constructor avoids copying the _Any_data POD when we don't need to. We can also inline the effects of swap, by copying each member and then zeroing the pointer members. This makes moving an empty object at least as fast as copying an empty object. Signed-off-by: Jonathan Wakely <jwakely@redhat.com> libstdc++-v3/ChangeLog: PR libstdc++/101923 * include/bits/std_function.h (function(function&&)): Check for non-empty parameter before doing any work.
-rw-r--r--libstdc++-v3/include/bits/std_function.h12
1 files changed, 10 insertions, 2 deletions
diff --git a/libstdc++-v3/include/bits/std_function.h b/libstdc++-v3/include/bits/std_function.h
index c084844..fb86ff1 100644
--- a/libstdc++-v3/include/bits/std_function.h
+++ b/libstdc++-v3/include/bits/std_function.h
@@ -389,8 +389,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* (if it has one).
*/
function(function&& __x) noexcept
- : _Function_base()
- { __x.swap(*this); }
+ : _Function_base(), _M_invoker(__x._M_invoker)
+ {
+ if (static_cast<bool>(__x))
+ {
+ _M_functor = __x._M_functor;
+ _M_manager = __x._M_manager;
+ __x._M_manager = nullptr;
+ __x._M_invoker = nullptr;
+ }
+ }
/**
* @brief Builds a %function that targets a copy of the incoming