c++ vector复制赋值,调用其元素的复制机制

C++ vector copy assignment, calling which copy mechanism of its elements?

本文关键字:复制 元素 机制 vector 赋值 c++ 调用      更新时间:2023-10-16

我的类A显式地实现了它的复制构造函数和复制赋值。

当对这些元素的向量进行复制赋值时,使用哪种复制机制?

:

vector<A> a1, a2(5);
a1 = a2;

A的复制构造函数用于a1的所有新元素,并将a2的元素作为输入?

还是在a1中为元素腾出空间,然后使用Aoperator=a2的元素作为输入?

如果a1在赋值前不是空的怎么办?

它被指定了吗?

我的类的复制构造函数和operator=不完全做同样的事情(这是不好的做法吗?到目前为止主要是测试的东西)。看起来像是调用了复制构造函数,但我想知道它是否保证是这样的,还是在这个例子中碰巧是这样的。

在这个上下文中,它将调用复制构造函数5次。因为a1是空的,所以没有任何元素可以让赋值给。所以它们需要复制构造。

一般来说,它将调用复制/移动构造/赋值或删除的适当组合。所有这些都取决于所讨论的向量的大小,您正在执行的特定向量操作以及操作数的值类别。

看起来像调用了复制构造函数,但我想知道它是否保证是这样的,或者在这种情况下它只是碰巧是这样的。

可以保证对于异常安全的基于swap的赋值实现:

struct SomeClass
{
    SomeClass(const SomeClass& other) { ... }
    SomeClass(SomeClass&& other) { ... }
    // Copy/move construction is performed while initializing the parameter
    void operator=(SomeClass other)
    {
        this->swap(other);
    }
    void swap(SomeClass& other) { ... }
};

这种赋值实现的缺点是——由于它的通用性——它不是最优的(例如,在self赋值的情况下,它做了不必要的工作)。

一般来说,如果可以排除异常安全问题,则对对象进行复制赋值可以比销毁对象并构造源对象的原位副本更快。因此,您应该期望追求性能的实现尽可能通过赋值来执行对象的赋值,而不是通过其子对象的复制构造来执行。