c++11 - 转换为右值引用以“强制”在返回值中移动 - 澄清
问题描述
好的,我开始了解右值引用的要点(我认为)。我有我正在编写的这段代码:
#include <iostream>
using namespace std;
std::string get_string()
{
std::string str{"here is your string\n"};
return std::move(str); // <----- cast here?
}
int main ()
{
std::string my_string = std::move(get_string()); // <----- or cast here?
std::cout << my_string;
return 0;
}
所以我有一个简单的例子,我有一个返回字符串副本的函数。我已经读过它不好(并得到了核心转储来证明它!)返回对本地临时变量的任何引用,所以我不考虑尝试。
在main()
我不想复制构造该字符串的分配中,我想移动构造/分配字符串以避免复制字符串太多。
Q1:我返回了 temp var 的“副本”,
get_string()
但我已将返回值转换为 rvalue-red。那是没有意义的,还是在做任何有用的事情?Q2:假设 Q1 的答案是我不需要这样做。然后我是将 temp 变量的新副本移动到 中
my_string
,还是直接将 temp 变量移动str
到my_string
.Q3:为了将字符串返回值存储到“外部”(在我的情况下是 main())变量中,您需要的最小副本数是多少,以及您如何做到这一点(如果我还没有实现它)?
解决方案
我在 get_string() 中返回了 temp var 的“副本”——但我已将返回值转换为 rvalue-red。那是没有意义的,还是在做任何有用的事情?
您不必std::move
在这种情况下使用,因为值返回的局部变量会为您“隐式移动”。标准中有一个特殊的规则。在这种情况下,您的举动是悲观的,因为它可以防止 RVO(clang 警告)。
Q2:假设 Q1 的答案是我不需要这样做。然后我是将临时变量的新副本移动到 my_string 中,还是直接将临时变量 str 移动到 my_string 中。
你不需要std::move
调用的结果get_string()
。get_string()
是prvalue,这意味着my_string
将自动调用 的移动构造函数(C++17 之前)。在 C++17 及更高版本中,强制复制省略将确保不会发生移动/复制(使用prvalues)。
Q3:为了将字符串返回值存储到“外部”(在我的情况下是 main())变量中,您需要的最小副本数是多少,以及您如何做到这一点(如果我还没有实现它)?
取决于标准以及是否发生 RVO。如果发生 RVO,您将拥有 0 个副本和 0 个移动。如果您以 C++17 为目标并从prvalue进行初始化,则保证您有 0 个副本和 0 个移动。如果两者都没有发生,您可能只有一个动作 - 我不明白为什么这里应该出现任何副本。
推荐阅读
- python - 如何更改 tkinter Mac OS X 中的标题栏?
- c - 在堆栈与堆中初始化一个指针
- python - 使用张量流进行图像分割的卷积神经网络
- android - 我无法从 RecyclerView 适配器调用 ViewPager 中的方法
- python - 使用 Python 从计算机访问 Android 平板电脑的位置
- python - 如何在python中获取最后发送的消息值
- javascript - HTML 日历禁用特定日期
- java - Hazelcast Jet 与命名的 Jdbc 查询或结果集?
- terraform - 如何使用 terraform 在 aws 中为多个实例创建多个目标组?
- python - 通过 pip 安装本地 cython 包不会使其模块可访问