[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