当前位置: 首页 > news >正文

C++—— pass by value and use std::move

一个警告引发的思考

在c++11之前,无论是effective系列还是c++教程,都会告诉我们在一定情况下使用const &来节省性能。但是在c++11之后,有了移动语义,使一些不可能的行为变成了可能。我们先来看一段简单的代码。

class Person {
private:
    unsigned m_age = 0;
    string m_name;
    Person(const string & name) : m_name(name) { }
}

clang-tidy会给出这样的一个警告。

Clang-Tidy: Pass by value and use std::move

为什么会这样呢,这无疑是一个正确的构造函数,但是为什么还要给我们这样的警告呢?

使用值传递加移动语义避免不必要的消耗

我们按照警告更改成后是这样

Person(string  name) : m_name(std::move(name)) { }

你可能会感到疑惑?为什么使用了值传递还会有更高的性能呢?这似乎和直觉不符。

慢慢来,我们一点点分析。

假设调用构造函数传递的是一个左值,那么好,string会进行copy一次,然后再进行一次移动构造。 

假设调用构造函数传递的是一个右值,string会进行一次右值版本的构造,也就是一次移动构造,然后再进行一次移动构造。

第一种情况:一次拷贝构造 + 一次移动构造

第二种情况:两次移动构造

而如果我们还是使用const & 的方式来进行拷贝构造,无论如何,都需要

拷贝指针一次(引用)+ 一次拷贝构造

很明显,pass by value and use std::move的情况平均下来应当是好于pass by const reference and use copy constructor

作者思考:

        pass by value and use std::move 这样的改变,在大部分的情况下是无关痛痒的。大部分情况下,你可以听从clang-tidy的建议,但是不用为了追求移动而移动,不用为了高级而高级。简单胜于繁琐,简洁胜于冗杂。

相关文章:

  • STM32CubeIDE更新ST LINK驱动失败解决方法
  • PHP cURL 函数
  • 可编程 USB 转串口适配器开发板 SHT3x-DIS 温湿度传感器芯片
  • Git - branch name
  • Vue+element 商品参数业务实现
  • Java项目:SSM博物馆售票管理系统
  • 资料美国二手APX582音频分析仪APX582
  • 流水线:如何做到应用分钟级上线交付?
  • 《算法图解》阅读笔记
  • 正点原子STM32F103 DMA代码例程魔改
  • 第三章 索引
  • Makefile 常见的错误信息
  • Spring的事务机制
  • Springboot+学生作业管理系统 毕业设计-附源码251208
  • R语言使用sample函数从dataframe中抽样指定个数的数据行、并配置是否有放回抽样(Random samples)
  • 【面试系列】之二:关于js原型
  • Angular6错误 Service: No provider for Renderer2
  • Angularjs之国际化
  • canvas 绘制双线技巧
  • css选择器
  • es6
  • Flannel解读
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Mysql数据库的条件查询语句
  • 前端面试题总结
  • 设计模式走一遍---观察者模式
  • 推荐一个React的管理后台框架
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • FaaS 的简单实践
  • ​TypeScript都不会用,也敢说会前端?
  • (4)logging(日志模块)
  • (AngularJS)Angular 控制器之间通信初探
  • (C++17) optional的使用
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (九)One-Wire总线-DS18B20
  • (生成器)yield与(迭代器)generator
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net中生成excel后调整宽度
  • :=
  • @WebService和@WebMethod注解的用法
  • [1181]linux两台服务器之间传输文件和文件夹
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [Android]通过PhoneLookup读取所有电话号码
  • [C#]C#学习笔记-CIL和动态程序集
  • [C++]运行时,如何确保一个对象是只读的
  • [iOS]中字体样式设置 API
  • [LeetCode] 148. Sort List 链表排序