温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-11-29 13:44:37 来源:亿速云 阅读:119 作者:iii 栏目:大数据

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

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

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

Example(示例)

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

std::vector<int> 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<pair<int, int>> v;
   map<string, int> 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++中为什么要保证拷贝赋值对自我赋值安全”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI