问题标签 [move-assignment-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1496 浏览

c++ - 分配 make_unique到 shared_ptr

我(错误地)在我的程序中有以下任务:

当我发现这个时,我首先想知道为什么它甚至可以编译。事实证明,对象shared_ptr有一个特殊的移动赋值运算符unique_ptr

我的问题是,这样做是否总是安全的,还是有任何影响?

(代码执行安全;代码审查显然不安全......)

0 投票
0 回答
927 浏览

c++ - MISSING_MOVE_ASSIGNMENT 结果的标准是什么?

我们开始在 Windows 上使用 Coverity 扫描跨平台代码库。在 Windows 上,我们收集了五个Missing move assignment operator (MISSING_MOVE_ASSIGNMENT)发现。这些发现在 Unix、Linux 或 OS X 上不存在。

我们是一个与 C++03 - C++17 兼容的 C++ 库。迄今为止,由于 Jonathan Wakely 建议我们这样做(来自如何确定何时合成 C++11 移动?在 GCC 邮件列表上),我们已经单独留下了移动分配:

所以你不应该关心[关于提供移动]。如果搬家可能不安全,那就不会发生。如果移动是安全的,那么它可能会发生,但在这些情况下,您最好让编译器生成正确的移动而不是干涉。

我想知道 Coverity 使用什么标准进行调查。Coverity 如何确定我们有机会改进编译器生成的?

(我不是在质疑这一发现。我是在努力更好地理解它,理解为什么扫描服务认为我们可以做得更好,并理解机会在哪里。而“更好的工作”可能只适用于 Windows)。


这是其中一项发现。其他可在 Coverity Scan 站点上找到。

0 投票
2 回答
1270 浏览

c++ - 标准库中自赋值不安全的移动赋值运算符的基本原理是什么?

关于移动分配的标准库策略是允许实现假设自分配永远不会发生;在我看来,这似乎是一个非常糟糕的主意,因为:

  • C++ 中的“常规”(“副本”)分配合同一直被认为是安全的,可以防止自分配;现在我们要记住和解释另一个不连贯的 C++ 极端案例——也是一个非常危险的案例;我想我们都同意,C++ 需要的不是更多隐藏的陷阱;
  • 它使算法复杂化——remove_if家庭中的任何事情都需要处理这种极端情况;
  • 满足这个要求真的很容易——在你使用 swap 实现 move 的地方它是免费的,甚至在其他情况下(你可以通过 ad-hoc 逻辑获得一些性能提升)它只是一个单一的,(几乎)从未被采用分支,在任何 CPU 上几乎都是免费的¹;此外,在大多数有趣的情况下(涉及参数或局部变量的移动),优化器在内联时将完全删除分支(这几乎总是发生在“简单”移动赋值运算符中)。

那么,为什么会做出这样的决定呢?


__builtin_expect¹ 特别是在库代码中,实现者可以自由地利用编译器特定的关于“分支预期结果”的提示(在 gcc/ __assumeVC++ 中思考)。

0 投票
2 回答
306 浏览

performance - 如何利用 Move Semantics 在 C++11 中获得更好的性能?

经过多次试验,我仍然不明白如何正确利用移动语义以便不复制操作结果而只使用指针或 std::move 来“交换”指向的数据。这对于加速 f(g(),h(i(l,m),n(),p(q())) 等更复杂的函数非常有用。目标是:

在执行下面的代码时,输​​出是:

代码:

在文件 main.cpp 中:

0 投票
3 回答
233 浏览

c++ - C++ declare a move/copy operation will suppress generation of related operations?

I saw a sentence in The C++ programing language which I'm confused with:

• If the programmer declares a copy operation, a move operation, or a destructor for a class,no copy operation, move operation, or destructor is generated for that class.

I wrote a test code shown below:

The result is: enter image description here

I define a move assignment, there should be not default copy assignment generated as said in the book, but how could a3 gets the copy of a1?

Another question:

I modified a3 assignment expression:

the result is: enter image description here

Then I comment out the move assignment and remove comment on copy assignment:

the result is: enter image description here

how could copy assignment be called? The result of a1+a2 is a rvalue, how could this rvalue be passed to copy assignment whose argument is const A&? Forgive my confusion about rvalue

any help is appreciated!

0 投票
1 回答
344 浏览

c++ - 为什么 std::sort 构造对象?

我创建了以下类来了解的行为std::sort

并运行以下基准代码:

在线 IDE 中的完整代码在这里:https ://wandbox.org/permlink/nbwRKptakgCSHK4f 。

特定函数的测量调用次数如下(全部带有-O2/O2标志):

如果我取消注释该swap功能,情况会好转:

但是,移动构造函数(加上析构函数)和移动赋值运算符的调用仍然很多。困扰我的是效率。例如,编译器可以内联swapand的调用,但我猜编译器可能不会“内联”(优化)对象的构造/销毁operator=

为什么在排序中使用对象的构造/分配?就地排序(通常std::sort这样做)可以纯粹通过比较和交换操作来实现。

更新

我的假设是错误的。优化对象创建/销毁似乎完全合法,例如:

因此,这样的代码可以像 custom 一样高效swap。在线示例:https ://godbolt.org/g/ud4u9U - 没有调用移动构造函数/赋值运算符,尽管这些并非微不足道,并且它们的功能已内联到main.

0 投票
1 回答
1994 浏览

c++ - 移动构造函数和移动赋值

我一直在阅读 Bjarne Stroustrup(c++ 的创建者)的《C++ 编程语言第 4 版》一书,并且一直在学习移动构造函数和移动赋值。

在类向量的书(见下面的标题1)中,他展示了如何实现移动构造函数(见下面的2),并说移动赋值是以类似的方式实现的,但没有展示如何实现。我自己实现了移动任务(见下面的 3),一切似乎都运行良好,但是,我不确定我是否正确实现了它。

我没有收到任何错误,并且查看了很多示例,但我无法确认它对于我的特定课程是否正确。有C++经验的人可以看看我的代码并评论是否正确?

编辑:另请参阅构造函数和析构函数的 4。

感谢您的时间。

PS:欢迎任何有用的提示或修改

1)类头文件:

2)移动构造函数(实现方式与book相同):

3)移动分配(不确定是否正确):

4)构造函数和析构函数:

0 投票
2 回答
382 浏览

c++ - 没有调用 c++ 复制分配和移动分配

我正在尝试实现复制和移动分配,但我不明白应该如何使用它们。我已阅读以下主题
何时调用了复制赋值运算符?
但这对我不起作用。

班级:

主要的

我想知道何时调用复制分配和移动分配。提前致谢。

0 投票
1 回答
764 浏览

c++11 - 如何正确转移 shared_ptr 的所有权?

我有以下代码片段:

运行后,我得到如下结果:

Q1:有人能解释一下主函数第三行调用后的 temp_PTR 是什么类型吗?

如果我将该行更改为

编译器抱怨说

Q2:我记得函数的返回值应该是一个r值,但是编译器似乎在这里告诉我:“嘿,Queue.front()的返回值是一个l值”,为什么在这里?

0 投票
1 回答
98 浏览

c++11 - 对于隐式声明的移动赋值运算符,用户声明是什么意思?

该声明

隐式声明的移动赋值运算符

如果没有为类类型(结构、类或联合)提供用户定义的移动赋值运算符,并且以下所有情况都为真:

没有用户声明的复制构造函数;
没有用户声明的移动构造函数;
没有用户声明的复制赋值运算符;
没有用户声明的析构函数;

使用用户声明的复制分配运算符是否仅表示

类名 & 类名 :: operator= ( 类名 && )

任何 operator=()定义?

例子:

这是否符合隐式声明的移动赋值运算符的条件?

隐式声明的移动构造函数也是如此。