From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 31A4F3857824; Tue, 12 Oct 2021 10:59:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 31A4F3857824 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r11-9111] libstdc++: Optimize std::function move constructor [PR101923] X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/releases/gcc-11 X-Git-Oldrev: da206878f64ef66b1f7527c4d87e8baf9a5c5bfd X-Git-Newrev: 73b0f810a17a5f529fc8342a2df31276d3538851 Message-Id: <20211012105923.31A4F3857824@sourceware.org> Date: Tue, 12 Oct 2021 10:59:23 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Oct 2021 10:59:23 -0000 https://gcc.gnu.org/g:73b0f810a17a5f529fc8342a2df31276d3538851 commit r11-9111-g73b0f810a17a5f529fc8342a2df31276d3538851 Author: Jonathan Wakely Date: Tue Aug 17 11:30:56 2021 +0100 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 libstdc++-v3/ChangeLog: PR libstdc++/101923 * include/bits/std_function.h (function(function&&)): Check for non-empty parameter before doing any work. (cherry picked from commit 0808b0df9c4d31f4c362b9c85fb538b6aafcb517) Diff: --- libstdc++-v3/include/bits/std_function.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/bits/std_function.h b/libstdc++-v3/include/bits/std_function.h index 31eba2b822c..da15bd20e37 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(__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