Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 移动类型非常昂贵_C++_Rvo - Fatal编程技术网

C++ 移动类型非常昂贵

C++ 移动类型非常昂贵,c++,rvo,C++,Rvo,我正在阅读官方CPPCore指南,以正确理解何时依靠RVO可靠,何时不可靠。 在F20,它被写为: 如果要移动的类型很昂贵(例如数组),请考虑 将其分配到免费存储并返回句柄(例如。, 唯一的(ptr),或将其在引用中传递给非常量目标对象 填充(用作输出参数) 我知道非STL类型没有针对移动进行优化,但我如何才能轻松检测到其他类型的移动成本,因此我不会在它们上使用RVO?您似乎误解了“RVO”是什么。“RVO”代表“返回值优化”,它是一种防止调用任何移动或复制构造函数的编译器优化。例如 std::

我正在阅读官方CPPCore指南,以正确理解何时依靠RVO可靠,何时不可靠。 在F20,它被写为:

如果要移动的类型很昂贵(例如数组),请考虑 将其分配到免费存储并返回句柄(例如。, 唯一的(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中-这不会产生任何成本,即使类型“移动起来很昂贵”

  • 如果一个类型移动起来很昂贵,那么复制起来也很昂贵——所以你真的没有选择的余地。重新设计代码,以便尽可能不需要复制/移动


RVO通常是一种优化。你为什么不想让它启动呢?“非STL类型没有优化到移动”-除非你写了一个移动任务/分配,并且它有运行时的好处。如果可以的话,没有什么能阻止你优化你的类型,使其具有移动语义。F.20真的是一个错误的建议吗?看来他们在这里不考虑RVO。他们说,
Package fill()的“坏:大值”,但是因为RVO,它一点也不坏……我已经理解了RVO是什么,我只是没有在这个问题上表达清楚(英语不是我的母语)。也许我应该说“当我相信我的编译器会使用RVO时”。在F20示例中,似乎函数中不需要副本,那么当我可以将其作为函数引用返回时,为什么“依赖”RVO呢?因此在F.20中,Bjarne/Herb express非常清楚,每次都不返回副本,而您说的正好相反,每次都依赖RVO…我有点困惑,抱歉:)@Taw-不,他们说不要返回昂贵对象的数组。这是一个具体的建议,而不是一般的“不要退货”。