gpt4 book ai didi

c++ - 返回值优化: Explicit move or implicit?

转载 作者:行者123 更新时间:2023-12-02 02:47:12 24 4
gpt4 key购买 nike

我有一个这样的函数,我是否必须在此处显式使用 move 还是它是隐式的?

std::vector<int> makeVector();
std::vector<int> makeVector2();

std::optional<std::vector<int>> getVectOr(int i) {
if(i==1) {
std::vector<int> v = makeVector();
return std::move(v);
}
else if(i==2) {
std::vector<int> v2 = makeVector2();
return std::move(v2);
}
return std::nullopt;
}

最佳答案

是否使用 std::move 并不重要或不。这里不会进行返回值优化。进行 RVO 有几个要求。

返回值优化的要求之一是返回值必须与函数返回类型相同

std::optional<std::vector<int>> getVectOr(int i)

您的函数返回 std::optional<std::vector<int>> ,因此只有相同类型的临时拷贝会被删除。在两个return这里有问题的语句,两个临时变量都是 std::vector<int>当然,它们不是同一类型,因此 RVO 不会发生。

无论发生什么,你都会返回 std::optional<std::vector<int>> 。这是这里的绝对要求。没有异常(exception)。但是从这个函数返回一些东西的冒险总是从 std::vector<int> 开始。 。无论你如何尝试,都无法将其变成完全不同的类型。沿途必须在某个地方 build 一些东西。没有返回值优化。

但是话虽如此:还有移动语义在这里发挥作用。如果星星幸运地为你对齐(这很可能),移动语义将允许一切发生,而无需复制大 vector 的内容。因此,虽然没有进行返回值优化,但您可能会中奖,并且无需在所有 RAM 中对 vector 的实际内容进行改组即可发生所有事情。您可以自己使用调试器来确认或否认您是否在该帐户上中了奖。

您也可能有其他类型的 RVO,即 return从函数中获取非 volatile 自 Action 用域对象:

std::optional<std::vector<int>> getVectOr(int i) {

std::optional<std::vector<int>> ret;

// Some code

return ret;
}

这里也可以进行返回值优化,它是可选的,但不是强制性的。

关于c++ - 返回值优化: Explicit move or implicit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60348197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com