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.