问题标签 [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.
c++ - 为什么我需要复制和交换习语?
我看不出在 C++11 中使用复制和交换习语有什么意义。如果我需要一个句柄,我可以使用unique_ptr
or shared_ptr
。如果我需要一个对象集合,我可以只使用vector
or string
。
对我来说,复制和交换习语听起来像是一个毫无意义的思考练习,充满了等待发生的错误。
担心异常
我是否需要担心自我分配?过早优化是万恶之源
我错过了
swap
在班级的构造函数中调用某个地方的地方吗?也许我忘记了
delete
某个地方?
假设我有一个令人信服的理由来使用手动内存管理。还有分配器,交换指针等。
在现代 C++中,我什么时候需要进行手动内存管理(new
,delete
)wrt 复制和交换?
c++ - 为什么我们在使用赋值运算符时要使用复制和交换?
使用复制和交换方法时,我对赋值运算符有疑问。
假设我们有一个很好的复制构造函数,它可以深度复制所有指针和动态分配的变量。
那么,上面的代码和下面的代码有什么区别呢?
由于我们有一个很好的复制构造函数,我认为另一个对象 s 是在 operator= 函数中创建的。那么,使用非抛出交换功能有什么意义呢?
c++ - 复制交换惯用语:如果我更改班级成员怎么办?
我有一堂课
为了使用复制交换习语,我创建了函数
如果稍后我更改了我的类并删除了 member a
,那么编译器会在swap
函数中抱怨,这很好。
但是如果我添加一个新成员,我的swap
功能就不再正确了。为了不忘记将新成员添加到交换功能,我该怎么做?
c++ - 复制和移动成语?
通过使用Copy & Swap习惯用法,我们可以轻松实现具有强大异常安全性的复制分配:
但是,这T
需要Swappable。如果std::is_move_constructible_v<T> && std::is_move_assignable_v<T> == true
感谢std::swap
.
我的问题是,使用“复制和移动”习语有什么缺点吗?像这样:
前提是你实现了移动赋值,T
因为显然你最终会得到无限递归。
这个问题与 Copy-and-Swap 成语是否应该成为 C++11 中的 Copy-and-Move 成语不同?因为这个问题更笼统,并且使用移动赋值运算符而不是实际手动移动成员。这避免了在链接线程中预测答案的清理问题。
c++ - 如何正确地为抽象类制作深拷贝?
我正在开发一个碰撞系统,我需要为其复制实体的碰撞器。
我制作了这样的系统,例如我不必一成不变地处理碰撞,(我可能会开始使用 AABB,但可能会更改为 SAT),但无论我使用哪种算法,我都需要对碰撞器进行深度复制将使用。
一方面,深拷贝是一种要求,而复制和交换习语似乎是我应该去的。
另一方面,我collidable
不需要是接口以外的任何东西,所以没有理由不做纯粹的虚拟。
因此,我开始写这个:
但我不能复制构造collidable
,因为它是纯虚拟的。
请注意,在同一个程序中,我永远不会同时使用多个碰撞算法,因此不会出现方法冲突。
我真的不知道我做错了什么,是设计方面还是技术方面,所以我完全愿意接受建议。
如何强制从可碰撞的类派生来实现 operator= ?
c++ - 多个构造函数参数的移动语义
对象的构造函数需要来自用户的 twp 参数。要求参数可以是不同的类型,但可以假定每种类型都实现正确的移动语义。(实际示例是一个cubic_spline 类,它是使用数字数据的随机访问对象[向量] 构造的,一个用于“x”,另一个用于“y”或“f(x)”。)
进一步要求用户可以传递任一参数以由对象复制,或者通过移动语义在不复制的情况下捕获。
以下适用于 VC++ std::vector (Dinkumware) 和我编写的自定义容器。真的这么简单吗?我认为下面的代码可能是正确的,但我有偷偷摸摸的怀疑。我的问题很简单,“这是正确的代码吗?” (如果不是,它怎么会失败,应该如何重写?不必要的数据复制将被视为失败。)
c++ - `std::swap` 应用于这些对象时会做什么?
编码
按预期输出
来自cplusplus.com > std::swap复杂性
非数组:常量:只执行一个构造和两个赋值(尽管请注意,这些操作中的每一个都有其自身的复杂性)。
数组: N 中的线性:对每个元素执行交换操作。
这是否意味着std::swap
当应用于a1
并且a2
仅交换指向数组的指针[1,2,3]
并且[11,12,13]
不复制任何int
或任何其他内容时?
std::swap
应用于类的两个对象时究竟做了A
什么?
假设std::swap
复制数组的所有元素,我是否应该编写一个static A::swap
函数,使用vector::swap
其时间复杂度是恒定的(来自cplusplus.com > vector::swap)意味着它只交换指针?
[..] 想添加一个注释,
std::swap
在 C++17 中更改了的语义。因此,提及编译器、它的版本以及您的目标标准可能是一个好主意。
我希望一个看起来很简单的问题不会带来 C++ 标准和编译器版本的复杂性。我通常用 C++11 编译我的代码。为了完整起见,这里是我笔记本电脑上的 gcc 版本。
c++ - 不推荐复制交换习语?
很长一段时间以来,我认为实现复制分配(对于非平凡类)的正确方法是使用复制交换习语。
但是后来我听到了 Howard Hinnant 的演讲https://www.youtube.com/watch?v=vLinb2fgkHk ,他说复制交换成语可以很好地实现强例外保证,但总的来说这是一种矫枉过正。
他在这里提到:https ://youtu.be/vLinb2fgkHk?t=2616
strong_assing(A& target, A const& source)
所以他建议明确地实现复制分配,并有一个包含复制交换的单独函数。
我不明白的是A& operator=(A const& other)
应该如何实施呢?
他建议有这样的东西吗?
这是什么std::vector
实现呢?也就是说,他们最后不使用复制交换习语吗?标准向量不需要强异常保证吗?