C++ 我是唯一一个觉得std::move有点太难理解的人吗?
因此,我一直在某地和其他地方阅读有关C++ 我是唯一一个觉得std::move有点太难理解的人吗?,c++,c++11,move-semantics,C++,C++11,Move Semantics,因此,我一直在某地和其他地方阅读有关std::move、std::forward、右值、左值广告等内容。但是我发现我不能理解它。尽管有时我会遇到一些问题,但我想我理解了C++之前的指针、引用等基本内容。是我还是这些东西太重了?如果您还没有阅读原始提案,我建议您阅读: 它非常清楚地列出了使用右值引用和移动语义可以解决的问题,以及如何使用右值引用和移动语义来解决这些问题 标准委员会的文件通常很密集,很难理解,但这篇文章很容易理解,非常值得一读。最终的C++0x标准(无论何时)中指定的右值引用和移动
std::move
、std::forward
、右值、左值广告等内容。但是我发现我不能理解它。尽管有时我会遇到一些问题,但我想我理解了C++之前的指针、引用等基本内容。是我还是这些东西太重了?如果您还没有阅读原始提案,我建议您阅读:
它非常清楚地列出了使用右值引用和移动语义可以解决的问题,以及如何使用右值引用和移动语义来解决这些问题
标准委员会的文件通常很密集,很难理解,但这篇文章很容易理解,非常值得一读。最终的C++0x标准(无论何时)中指定的右值引用和移动语义可能与本文中提出的不同,但概念仍然相同。您的问题非常笼统。也许我可以让你开始:
- 忽略开头的函数
和std:move()
std::forward()
- 右值引用的一个方面是保存临时值。
- 在C++03代码中,计算
矩阵z=a+b+C+d的临时值代码>(使用
)矩阵a、b、c、d;
- 使用重载的右值引用在矩阵上实现自己的
操作符+
- 你应该能够大大减少临时工的数量
- 在C++03代码中,计算
- 制作一个像
这样的容器类——复制成本很高Image
- 不要忘记执行移动和复制分配
- 发明一个工厂函数,其工作原理如下: Image load_matching_size(const char *fn_small, const char *fn_big) { pair<Image> ii = load_2_images(fn_small, fn_big); return ii.first.width() >= 64 ? ii.first : ii.second; } 图像加载匹配大小(常量字符*fn\u小,常量字符*fn\u大){ 第二对=加载2个图像(小fn,大fn); 返回ii.first.width()>=64?ii.first:ii.second; }
- 你能数一数临时工的人数吗?请注意,
将需要一个附加值并复制!(该示例的设计应使返回值优化(“RVO”)不可能实现)返回值
- 你能看出这是不必要的吗?函数返回后,
中的图像将很快被丢弃。编译器是否可以使用then作为返回值?(不,不可能。如果我们只有一张ii
),RVO就可以工作了)图像
- 使用
中的return
,您可以告诉编译器,您不再需要move
,它可以使用它进行返回。这样就可以使用move-c'tor而不是copy-c'tor为返回节省一份昂贵的my副本ii