Vit*_*meo 16
你似乎误解了"RVO"是什么."RVO"代表"返回值优化",它是一种编译器优化,可防止调用任何移动或复制构造函数.例如
std::vector<huge_thing> foo()
{
std::vector<huge_thing> result{/* ... */};
return result;
}
void bar()
{
auto v = foo(); // (0)
}
Run Code Online (Sandbox Code Playgroud)
任何体面的编译器都不会执行任何复制/移动操作,只需v在(0)处构造就绪.在C++ 17中,由于对prvalues的更改,这是强制性的.
在昂贵的举动方面:当然,可能会有类型昂贵的移动 - 但我想不出任何移动比副本更昂贵的情况.
因此:
依靠RVO,特别是在C++ 17中 - 即使对于"移动昂贵"的类型,也不会产生任何成本.
如果移动类型昂贵,复制也很昂贵 - 所以你真的没有选择.重新设计代码,以便在可能的情况下不需要复制/移动.
| 归档时间: |
|
| 查看次数: |
1004 次 |
| 最近记录: |