c++ - 是否推荐具有 copy-and-swap 习语和自赋值检查的复制赋值运算符?

标签 c++ c++11 stdvector copy-assignment

Here您可以看到带有自赋值检查的复制赋值运算符实现:

String & operator=(const String & s)
{
    if (this != &s)
    {
        String(s).swap(*this); //Copy-constructor and non-throwing swap
    }

    // Old resources are released with the destruction of the temporary above
    return *this;
}

这有利于 self 分配,但对性能不利:

  1. 因为每次它检查 if 语句(考虑到分支预测,我不知道它的最优程度是多少)
  2. 我们在这里也失去了右值参数的复制省略

所以我还是不明白如果我要实现std::vectoroperator=我会如何实现它。

最佳答案

是的,这段代码是多余的。确实,它导致了额外的不必要的分支。有了适当的交换和移动语义,下面的代码应该会更高效:

String& String::operator=(String s) { // note passing by value!

    std::swap(s, *this); // expected to juggle couple of pointers, will do nothing for self-assingment
    return *this;
}

另请注意,按值接受参数更有益。

关于c++ - 是否推荐具有 copy-and-swap 习语和自赋值检查的复制赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37125197/

相关文章:

c++ - 将数据序列化代码从 C++ linux/mac 移植到 C++ windows

c++ - 如何停止对我的 DLL 导出函数的名称修改?

c++ - 以下 std::vector 代码是否有效?

c++ - 在 C++ 中,如何声明一个将任何对象的 vector 数组作为参数的函数?

使用 WHILE 循环的直角三角形 C++ 代码

c++ - 在 C MBED 中使用 strstr,打印结果

c++ - CONFIG += c++11(仍然)在 Linux 上不起作用

c++ - 删除数组而不调用析构函数

C++ std::fill 和 std::fill_n 错误 "error C2679"

c++ - 我应该传递一个 std::vector 还是固定数量的参数?