按值返回时强制 RVO/移动构造
Forcing RVO / move construction when returning by value
假设我有一个对象'foo',其中包含一个复制构造函数和一个移动构造函数,以及一个函数
foo f() {
foo bar;
/* do some work */
return bar;
}
该标准似乎声明编译器将尝试执行:NRVO,按 r 值返回 ref,按值返回,失败;按此顺序。
有没有办法强制编译器永远不会按值返回,因为我的复制构造函数非常昂贵?
编译器将尝试执行:NRVO,按 r 值引用返回,按值返回,失败;按该顺序。
上面的措辞不准确,可能表明你这边有误解。编译器可以使用 NRVO(大多数会),如果不可用,它将始终按值返回,区别在于返回值的构造方式。如果您的类型具有移动构造函数,则编译器必须使用该构造函数,并且只有在您的类型没有移动构造函数时才会使用复制构造函数。
也就是说,如果您的类型具有移动构造函数,则使用该复制构造函数的编译器将不符合 C++11。
如果代码
具有有效的移动构造函数,则foo
永远不会通过复制返回。
您也可以使用 out-参数而不是返回:
void f(foo& bar) { ... }
但实际上,所有编译器都会做NVRO。
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 如果我们有 (N)RVO,当实际调用移动构造函数时?
- 复制 elision/RVO 会导致从同一对象复制/移动吗?
- 为什么结构化绑定禁用RVO和移动返回语句
- 如何在不妨碍RVO的情况下确保移动?
- 当使用三元运算符并删除移动/复制CTOR时,Visual Studio不执行RVO
- 按值返回时强制 RVO/移动构造
- RVO,移动语义和争取最佳代码
- RVO和NRVO优化+C++11移动操作员
- 有效使用移动语义和 (N)RVO
- 默认/删除在存在RVO的情况下移动构造函数和赋值
- C++11编译器何时会使RVO和NRVO优于移动语义和常量引用绑定