[Bug libstdc++/69724] New: Unnecessary temporary object during std::thread construction

redi at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Feb 9 00:32:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69724

            Bug ID: 69724
           Summary: Unnecessary temporary object during std::thread
                    construction
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

#include <thread>
#include <cstdio>

class F {
public:
    F() { std::puts("create"); }
    ~F() { std::puts("destroy"); }
    F(const F&) { std::puts("copy"); }
    F(F&&) noexcept { std::puts("move"); }
    void run() { }
};

int main()
{
  std::thread{&F::run, F{}}.join();
}

prints:

create
move
move
destroy
destroy
destroy

The standard requires a copy to be made, so one of the move constructions is
required, but a more efficient result would be:

create
move
destroy
destroy

This could be done by removing the call to __bind_simple() and constructing the
_Bind_simple member of the thread::_State_impl directly, rather than returning
by value from __bind_simple() and then moving that value into the member.

However, the benefit for most types is probably small so the additional
complexity might not be worth it.


More information about the Gcc-bugs mailing list