42得票1回答
为什么在这种情况下Visual Studio不能执行返回值优化(RVO)

我正在回答一个问题并推荐对于大型类型返回值使用按值返回,因为我相信编译器会执行返回值优化(RVO)。但后来有人指出Visual Studio 2013没有在我的代码上执行RVO。 我找到了这里的一个问题,关于Visual Studio无法执行RVO,但在那种情况下,结论似乎是如果真的很重要,...

35得票1回答
C++11返回锁时的移动操作

在《C++ Concurrency in Action》一书中,阅读以下方法: std::unique_lock<std::mutex> wait_for_data() { std::unique_lock<std::mutex> head_lock(head...

26得票1回答
为什么结构化绑定在返回语句中禁用了RVO和move?

假设我们有一个名为 AAA 的类,它支持 复制/移动: class AAA { public: AAA() = default; ~AAA() = default; AAA(const AAA& rhs) { std::cout &lt...

21得票4回答
元组/解构的返回值优化

我正在研究元组/绑定返回值优化,但我观察到的行为与我预期的不同。在下面的示例中,我希望运用移动语义,事实上它的确发挥了作用,但仍存在一次复制操作。以下是优化后的输出:Test duo output, non_reference tuple Default constructor invoked...

20得票3回答
C++统一赋值运算符移动语义

编辑:已解决,请参见评论。 - 不知道如何在没有答案的情况下标记为已解决。 在观看了 Channel 9 上有关 c++0x 中完美转发 / 移动语义的视频后,我有些倾向于认为这是编写新赋值运算符的好方法。 #include <string> #include <vect...

15得票2回答
C++17中使用不可移动类型和保证返回值优化的结构化绑定实现多个返回值。

在C++ 17中,我们将有可能通过所谓的保证返回值优化(RVO)返回不可移动(包括不可复制)类型,例如std::mutex。这是通过简化值类别实现保证复制省略实现的: struct nocopy { nocopy(nocopy&) = delete; nocopy() = defau...

14得票1回答
为什么RVO要求如此严格?

又一个关于“为什么必须使用std :: move防止(未命名的)返回值优化?”的问题: 为什么std :: move会防止RVO?解释了标准明确要求函数声明的返回类型必须与return语句中表达式的类型相匹配。这解释了符合规范的编译器的行为;但是,它并不能解释限制的原理。 为什么RVO的规...

13得票2回答
从类方法返回成员unique_ptr

我试图返回一个std::unique_ptr类成员变量(尝试移动所有权)给调用者。以下是样例代码片段:class A { public: A() : p {new int{10}} {} static std::unique_ptr<int> Foo(A &a) ...

12得票1回答
昂贵的移动类型

我正在阅读官方的CPPCoreGuidelines,以正确理解何时可以依赖RVO,何时不行。在F20中写道: 如果一个类型移动开销很大(例如数组),考虑将其分配到自由存储区并返回句柄(例如unique_ptr),或将其传递给非const目标对象的引用以填充(用作输出参数) 我理解非...

11得票1回答
C++返回值优化,多个未命名返回

让我们考虑这两个函数:// 1. Multiple returns of the same named object string f() { string s; if (something()) return s.assign(get_value1()); ...