gpt4 book ai didi

C++11 右值和 move 语义混淆(return 语句)

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:40 24 4
gpt4 key购买 nike

我正在尝试理解 C++11 的右值引用和 move 语义。

这些示例之间有什么区别,哪些示例不进行 vector 复制?

第一个例子

std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}

std::vector<int> &&rval_ref = return_vector();

第二个例子

std::vector<int>&& return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

第三个例子

std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

最佳答案

第一个例子

std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}

std::vector<int> &&rval_ref = return_vector();

第一个例子返回一个被 rval_ref 捕获的临时值。该临时对象的生命周期将延长到 rval_ref 定义之外,您可以像按值捕获它一样使用它。这与以下内容非常相似:

const std::vector<int>& rval_ref = return_vector();

除了在我的重写中你显然不能以非常量方式使用 rval_ref

第二个例子

std::vector<int>&& return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

在第二个示例中,您创建了一个运行时错误。 rval_ref 现在包含对函数内已析构的 tmp 的引用。运气好的话,这段代码会立即崩溃。

第三个例子

std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

您的第三个示例与您的第一个示例大致相同。 tmp 上的 std::move 是不必要的,实际上可能是一种性能悲观化,因为它会抑制返回值优化。

最好的编码方式是:

最佳实践

std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}

std::vector<int> rval_ref = return_vector();

即就像在 C++03 中一样。 tmp 在返回语句中被隐式视为右值。它将通过返回值优化(不复制,不 move )返回,或者如果编译器决定它不能执行 RVO,那么它 will use vector's move constructor to do the return .仅当不执行 RVO 且返回类型没有 move 构造函数时,才会使用复制构造函数返回。

关于C++11 右值和 move 语义混淆(return 语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17607696/

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