C++ 移动类型非常昂贵
我正在阅读官方CPPCore指南,以正确理解何时依靠RVO可靠,何时不可靠。 在F20,它被写为:C++ 移动类型非常昂贵,c++,rvo,C++,Rvo,我正在阅读官方CPPCore指南,以正确理解何时依靠RVO可靠,何时不可靠。 在F20,它被写为: 如果要移动的类型很昂贵(例如数组),请考虑 将其分配到免费存储并返回句柄(例如。, 唯一的(ptr),或将其在引用中传递给非常量目标对象 填充(用作输出参数) 我知道非STL类型没有针对移动进行优化,但我如何才能轻松检测到其他类型的移动成本,因此我不会在它们上使用RVO?您似乎误解了“RVO”是什么。“RVO”代表“返回值优化”,它是一种防止调用任何移动或复制构造函数的编译器优化。例如 std::
如果要移动的类型很昂贵(例如数组),请考虑 将其分配到免费存储并返回句柄(例如。, 唯一的(ptr),或将其在引用中传递给非常量目标对象 填充(用作输出参数)
我知道非STL类型没有针对移动进行优化,但我如何才能轻松检测到其他类型的移动成本,因此我不会在它们上使用RVO?您似乎误解了“RVO”是什么。“RVO”代表“返回值优化”,它是一种防止调用任何移动或复制构造函数的编译器优化。例如
std::vector<huge_thing> foo()
{
std::vector<huge_thing> result{/* ... */};
return result;
}
void bar()
{
auto v = foo(); // (0)
}
std::vector foo()
{
std::向量结果{/*…*/};
返回结果;
}
空条()
{
自动v=foo();/(0)
}
任何像样的编译器都不会执行任何复制/移动操作,只需在(0)处就地构造v
。在C++17中,这是必需的,这要归功于对pr值的更改
就昂贵的移动而言:当然,移动的类型可能会很昂贵,但我想不出有哪一种移动会比拷贝更昂贵 因此:
- 依赖RVO,特别是在C++17中-这不会产生任何成本,即使类型“移动起来很昂贵”
- 如果一个类型移动起来很昂贵,那么复制起来也很昂贵——所以你真的没有选择的余地。重新设计代码,以便尽可能不需要复制/移动
Package fill()的“坏:大值”代码>,但是因为RVO,它一点也不坏……我已经理解了RVO是什么,我只是没有在这个问题上表达清楚(英语不是我的母语)。也许我应该说“当我相信我的编译器会使用RVO时”。在F20示例中,似乎函数中不需要副本,那么当我可以将其作为函数引用返回时,为什么“依赖”RVO呢?因此在F.20中,Bjarne/Herb express非常清楚,每次都不返回副本,而您说的正好相反,每次都依赖RVO…我有点困惑,抱歉:)@Taw-不,他们说不要返回昂贵对象的数组。这是一个具体的建议,而不是一般的“不要退货”。