C++ 编译器可以免费使用std::move(foo)
:
- 如果已知它
foo
已经到了生命周期的尽头,并且
- 除了 C++ 规范允许的语义效果之外,隐式使用
std::move
不会对 C++ 代码的语义产生任何影响。
这取决于 C++ 编译器的优化能力,在遵守 C++ 规范规则的同时,它是否能够计算从f(foo); foo.~Foo();
到的哪些转换f(std::move(foo)); foo.~Foo();
在性能或内存消耗方面是有利可图的。
从概念上讲,2017 年的 C++ 编译器,例如 GCC 6.3.0,能够优化此代码:
Foo meh() {
Foo foo(args);
foo.method(xyz);
bar();
return foo;
}
进入这段代码:
void meh(Foo *retval) {
new (retval) Foo(arg);
retval->method(xyz);
bar();
}
这避免了调用 . 的复制构造函数和析构函数Foo
。
2017 年的 C++ 编译器,例如 GCC 6.3.0,无法优化这些代码:
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;
}
进入这些代码:
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;
}
这意味着 2017 年的程序员需要明确指定此类优化。