千家信息网

C++中为什么要保证拷贝赋值对自我赋值安全

发表于:2024-09-26 作者:千家信息网编辑
千家信息网最后更新 2024年09月26日,本篇内容介绍了"C++中为什么要保证拷贝赋值对自我赋值安全"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所
千家信息网最后更新 2024年09月26日C++中为什么要保证拷贝赋值对自我赋值安全

本篇内容介绍了"C++中为什么要保证拷贝赋值对自我赋值安全"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

C.62:保证拷贝赋值对自我赋值安全
Reason(原因)

如果x=x改变了x的值,人们会觉得很奇怪,同时也会发生很不好的错误。(通常会包含泄露)

Example(示例)

标准库容器处理自我赋值的方式优雅且高效:

std::vector v = {3, 1, 4, 1, 5, 9};
v = v;
// the value of v is still {3, 1, 4, 1, 5, 9}
Note(注意)

产生于正确处理了自我赋值的成员的默认的赋值操作会处理自我赋值问题。

struct Bar {
vector> v;
map m;
string s;
};

Bar b;
// ...
b = b; // correct and efficient
Note(注意)

你可以通过明确地对自我赋值进行检查的方式防止自我赋值,但是通常不使用上述检查的处理方式(例如使用swap)的方式更快,更优雅。

class Foo {
string s;
int i;
public:
Foo& operator=(const Foo& a);
// ...
};

Foo& Foo::operator=(const Foo& a) // OK, but there is a cost
{
if (this == &a) return *this;
s = a.s;
i = a.i;
return *this;
}

这种做法看起来安全并且高效。但是如果在一百万次赋值中只发生一次自我赋值的情况下会怎么样呢?大概有一百万次多余的检查(但是由于本质上结果总是一样的,计算机的分支预测会每次都猜对)。考虑下面的代码:

Foo& Foo::operator=(const Foo& a)   // simpler, and probably much better
{
s = a.s;
i = a.i;
return *this;
}

std::string对自我赋值安全,int也是。所有的代价都来自(极少)发生的自我赋值。

Enforcement(实施建议)

(简单)赋值运算符不应该包含以下的检查:if (this == &a) return *this;

"C++中为什么要保证拷贝赋值对自我赋值安全"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0