A C++ compiler is free to use std::move(foo)
:
- if it is known that
foo
is at the end of its lifetime, and
- the implicit use of
std::move
won't have any effect on the semantics of the C++ code other than the semantic effects allowed by the C++ specification.
It depends on the optimization capabilities of the C++ compiler whether it is able to compute which transformations from f(foo); foo.~Foo();
to f(std::move(foo)); foo.~Foo();
are profitable in terms of performance or in terms of memory consumption, while adhering to the C++ specification rules.
Conceptually speaking, year-2017 C++ compilers, such as GCC 6.3.0, are able to optimize this code:
Foo meh() {
Foo foo(args);
foo.method(xyz);
bar();
return foo;
}
into this code:
void meh(Foo *retval) {
new (retval) Foo(arg);
retval->method(xyz);
bar();
}
which avoids calling the copy-constructor and the destructor of Foo
.
Year-2017 C++ compilers, such as GCC 6.3.0, are unable to optimize these codes:
Foo meh_value() {
Foo foo(args);
Foo retval(foo);
return retval;
}
Foo meh_pointer() {
Foo *foo = get_foo();
Foo retval(*foo);
delete foo;
return retval;
}
into these codes:
Foo meh_value() {
Foo foo(args);
Foo retval(std::move(foo));
return retval;
}
Foo meh_pointer() {
Foo *foo = get_foo();
Foo retval(std::move(*foo));
delete foo;
return retval;
}
which means that a year-2017 programmer needs to specify such optimizations explicitly.