问题标签 [copy-and-swap]

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 投票
1 回答
110 浏览

c++ - 共享指针的复制和交换效率

这可以看作是对例如为什么共享指针分配“交换”?.

问题是关于在 boost 中使用的 Copy&Swap 成语。

我确实理解 Copy&Swap 的好处是重用现有代码,从而避免重复和错误。但是有两种情况(实际上可以减少到另一种)不是最佳的:

  1. 智能指针实例相同
  2. 包含的指针是一样的

因为shared_ptrref 计数器是自动递增的,并且对于intrusive_ptr(仅提升)它们可能是递增的。所以复制成本很高

如果分配的实现方式如下:

这不是最快和最安全的实施,还是我没有看到任何问题?

如果它是最快的,为什么不使用它的 boost 或 stdlib?

为了澄清第 2 点,请考虑以下代码:

不是自分配&a != &b。Copy&Swap确实 涉及对引用计数器的不必要修改。

0 投票
1 回答
117 浏览

c++ - 为什么在我执行复制和交换习语时不调用我的复制构造函数?

在下面的代码中,当使用赋值运算符时,为什么没有调用复制构造函数或者为什么没有对应的打印?

上述代码的输出是:

0 投票
2 回答
91 浏览

c++ - 错误:使用复制和交换习语的交换函数中“operator=”的重载不明确

在具有常量引用作为成员的类中使用复制和交换习语时,会发生上述错误。

示例代码:

当 Copy 赋值运算符被更改为通过引用而不是按值获取其参数时,该错误已得到修复。

为什么这可以修复错误?一种可能的含义是链接问题中引用的重要优化可能性丢失了。参考文献是这样吗?这种变化的其他影响是什么?

有一个依赖此运算符的代码库,不存在其他成员,只有提到的引用。是否需要以某种方式使代码库适应这种变化,或者它是否安全?

0 投票
2 回答
97 浏览

c++ - 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?

仅在GCCClang中测试,基类中存在按值传递的复制赋值运算符(在实现复制和交换(或复制和移动)习语时很有用)导致复制赋值运算符在要隐式删除的派生类。

Clang 和 GCC 对此表示同意;为什么会这样?

示例代码:

0 投票
1 回答
72 浏览

c++ - 复制和交换习语与移动操作之间的交互

我正在尝试制作一个实现“复制和交换”习语之间交互的程序,move control operations因此我编写了以下代码:

  • 对我来说一切都很好,所以我认为在1copy-ctor 中由复制分配运算符调用以初始化其参数(它按值获取)然后使用交换。在“2”中,我是从 r 值分配的,因此我认为编译器应用了一些“复制省略”优化;在复制赋值运算符中直接创建一个对象。

  • 我不确定的是 3 和 4。所以这里是 3 和 4 的结果:

    取消注释第 3 行:

    /li>

取消注释第 4 行:

  • 为什么要使用 3 和 4 std::move,但要调用 n 个额外的构造函数?

** 哪个是有效的:定义一个复制/移动赋值运算符,取值或两个单独的版本:复制赋值和移动赋值?因为每次调用它的一个版本要么调用(额外调用)copy-ctor 或 move-ctor 来初始化其参数吗?

0 投票
1 回答
105 浏览

c++ - 在复制赋值运算符中按值传递与按引用传递

首先,有一个类似的热门帖子What is the copy-and-swap idiom?. 接受的答案具有指向https://web.archive.org/web/20140113221447/http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/的链接。

接受和链接的页面都表明复制赋值运算符的常用实现是(从上一个链接复制和粘贴)

但那

由于编译器的复制省略优化,更好,或者通常,总是按值传递而不是通过引用传递,然后复制通过引用传递的参数。

我同意第二个选项与第一个选项相同或更好,但并不差,但我很困惑为什么第一个选项一开始就是这样写的。我不明白为什么需要临时变量和交换。

相反,我们不能只做类似的事情:

它不使用复制构造函数。

0 投票
1 回答
66 浏览

python - 交换数组中的元素导致问题

新年快乐。我有一个关于在 Python 环境下交换数组中的元素的问题。没有问题的代码是:

有答案:

错误的是:

有答案:

我不确定为什么引用(我应该称之为)会造成麻烦。你介意详细解释一下吗。
谢谢。

0 投票
1 回答
103 浏览

c++ - 我是否正确理解 RAII 和复制/交换习语?

管理资源句柄(文件句柄、gpu 句柄、互斥体)的类希望防止资源句柄被复制,因此包装类的解构会自动释放资源一次且只有一次,并且没有任何东西可以访问句柄不再是因为对象的生命周期已经结束并且(希望)不再存在指向包装器的引用或指针。

5(半)的复制/交换和规则表示通常您要定义复制构造函数/赋值运算符。复制资源句柄显然是不需要的。我是否理解正确,因此只需删除任何其他构造函数/赋值运算符就可以解决这个问题(如果我分配了未转换为右值的东西(因此在分配完成后不再存在),编译器会冲我大喊大叫))

这与这个问题有关,因为我要构造的资源实际上只有在它们所属的包含数据结构已经构造之后才能构造,因此有必要移动资源,而不是复制它们。

OpenGL 的并行资源加载

0 投票
1 回答
42 浏览

c++ - LinkedList 类中的 swapList() 和 operator=() 函数在 C++ 中不断崩溃

我需要一个 swapList(LinkedList& Other) 函数来负责基本上交换两个列表的值。目前,它取 Other 的最后一个元素并将其输入到 *this 的第一个元素中。然后它还将 Other 的最后一个元素移动到其列表的前面。这是我到目前为止所拥有的:

现在,我知道了复制交换习语,我相信这意味着我可以在 operator=() 重载中调用交换函数。我似乎无法弄清楚交换。我玩过很多次,这既不是我的第一次,也不是我最后一次迭代该函数。任何帮助深表感谢。搜索只会在单个列表中产生交换节点。

0 投票
0 回答
48 浏览

c++ - 为什么复制构造函数需要赋值运算符?

作为 C++ 的初学者,我在阅读复制构造函数和赋值运算符时发现了以下代码。

在代码下方,我发现它需要 operator=

我不明白为什么有三个规则,仅仅通过复制构造函数就不能工作吗?

这个类几乎成功地管理了数组,但它需要 operator= 才能正常工作。