C.62: Make copy assignment safe for self-assignment
C.62:保证拷贝赋值对自我赋值安全

Reason(原因)

If x = x changes the value of x, people will be surprised and bad errors will occur (often including leaks).

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

Example(示例)

The standard-library containers handle self-assignment elegantly and efficiently:

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

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

Note(注意)

The default assignment generated from members that handle self-assignment correctly handles self-assignment.

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

struct Bar {    vector> v;    map m;    string s;};Bar b;// ...b = b;   // correct and efficient

Note(注意)

You can handle self-assignment by explicitly testing for self-assignment, but often it is faster and more elegant to cope without such a test (e.g., using swap).

你可以通过明确地对自我赋值进行检查的方式处理自我赋值,但是通常不使用上述检查的处理方式(例如使用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;}

This is obviously safe and apparently efficient. However, what if we do one self-assignment per million assignments? That's about a million redundant tests (but since the answer is essentially always the same, the computer's branch predictor will guess right essentially every time). Consider:

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

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

std::string is safe for self-assignment and so are int. All the cost is carried by the (rare) case of self-assignment.

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

Enforcement(实施建议)

(Simple) Assignment operators should not contain the pattern if (this == &a) return *this; ???

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


觉得本文有帮助?请分享给更多人。

更多精彩文章请关注微信公众号【面向对象思考】!

面向对象开发,面向对象思考!

vector c++ 赋值_面对拷贝赋值时发生的自我赋值的正确态度时接受而不是防止相关推荐

  1. 解决IntelliJ IDEA报错:调用方法[manageApp]时发生异常java.lang.IllegalStateException: 启动子级时出错

    解决IntelliJ IDEA报错:调用方法[manageApp]时发生异常java.lang.IllegalStateException: 启动子级时出错 问题描述:   笔者将一个在 Tomcat ...

  2. 调用方法[manageApp]时发生异常 java.lang.IllegalStateException: 启动子级时出错

    学习maven的初步阶段 在写第一个HelloServlet的servlet程序时,碰见了这样的错误: 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache. ...

  3. DownloadString”时发生异常:“基础连接已经关闭: 发送时发生错误

    win10下安装scoop遇到错误:"DownloadString"时发生异常:"基础连接已经关闭: 发送时发生错误",记录一下解决过程. 确认powershe ...

  4. pythoninput赋值_零基础自学Python—⑥input()函数结果赋值

    (接上一篇) ✨现在,我们来亲自感受一下input()函数的用法:(图二) ✨当我们输入答案按回车键后,除了自己输入的信息,其他什么都没有?但是程序又没有报错,这是为什么呢? ✨我们反复强调代码是一行 ...

  5. python如何输入数字赋值_三、python语法(定义,赋值,注释,输入输出)

    一.变量的定义 1.必须使用英文 2.严格区分大戏小写 3.使用小驼峰的命名方式 4.由数字,字母,下划线,组成,不能以数字作为开头  (java 有数字,字母,下划线,$组成,不能以数字开头) 5. ...

  6. mysql某一列 赋值_[MySQL]定时把某一列值赋值给另一列

    前言 在做项目的时候需要根据用户的积分做一个排名和排名趋势(上升.下降或持平),首先,从排名趋势上分析,我的想法是,今天的排名(ranking)和昨天排名(oldranking)进行对比,然后给出趋势 ...

  7. python数组赋值_对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解 列表赋值: >>> a = [1, 2, 3] >>> b = a >>> print ...

  8. python 矩阵元素赋值_对numpy中数组元素的统一赋值实例

    Numpy中的数组整体处理赋值操作一直让我有点迷糊,很多时候理解的不深入.今天单独列写相关的知识点,进行总结一下. 先看两个代码片小例子: 例子1: In [2]: arr =np.empty((8, ...

  9. python数组元素赋值_对numpy中数组元素的统一赋值实例

    下面小编就为大家分享一篇对numpy中数组元素的统一赋值实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 Numpy中的数组整体处理赋值操作一直让我有点迷糊,很多时候理解的不深入. ...

最新文章

  1. 腐蚀rust高速箭怎么做不了_皮带轮动平衡怎么做
  2. html本地路径图片转成base64,canvas-toDataURL()将图片转为dataURL(base64)
  3. C#实现乞丐版IOC容器
  4. php判断记录,PHP判断数据库中的记录是否存在的方法,php数据库_PHP教程
  5. c# asp.net mvc 开发的正方教务助手(一)
  6. c++ doxygen 注释规范_利用Doxygen给C程序生成注释文档
  7. 如何开发rest接口服务_如何简化网络请求接口开发
  8. 用 Crontab 进行简单的备份日志任务计划
  9. MySQL高级知识(十)——批量插入数据脚本
  10. MongoDB学习day10--数据库导入导出
  11. oracle11g-R2静默安装报错[INS-32013]解决方案
  12. 用C语言进行完数的判断(for循环和数组思想)
  13. 树莓派4B+初始化配置全攻略(Raspbain+VNC+XShell) 格式化SD卡-烧录系统-初始化设置-SSH和VNC无显示器远程连接-(更新、换源、网络监控、中文输入法、CPU温度)附百度网盘
  14. 花式讲解校园网绕过认证原理
  15. 教你快速记住公司工作邮箱格式,再也不用百度“邮箱格式怎么写”啦!
  16. 匹配查询(Match)
  17. IC前端整合(RTL to Netlist)所包含的流程,及Synthesis的主要任务
  18. 如何看待有人说程序员岗位的前景一片灰暗
  19. 四川大学计算机学院赵怡,【喜讯】我校计算机学院学子在蓝桥杯大赛全国总决赛中再获佳绩...
  20. 亲亲小嘴后,不应该就是摸摸小胸么

热门文章

  1. Spring 3,Spring Web Services 2和LDAP安全
  2. 职称计算机考试 数量,职称计算机考试WPS基础考点:自动求和
  3. Linux下python包放在哪,在alpinlinux中使用apk安装的Python包
  4. java 哈希一致算法_一致哈希算法Java实现
  5. java文件复制速度_【Java】Java代码拷贝文件的速度
  6. su联合推拉插件_[实习小记一一SU建模]
  7. triplet loss后面不收敛_你的神经网络真的收敛了么?
  8. 欢乐鼠标自动点击器_使用ESP32 DIY蓝牙自动点击器,滑屏器
  9. matlab计算微分ppt,matlab-ch013(数值计算-微积分)20090923.ppt
  10. python取前三位_python3 获取前几个高频列表元素