《More Effective C++》- 极精简版 1-10条

        本文章属于专栏《业界Cpp进阶建议整理》


        本文列出《More Effective C++》的1-10条的个人理解的极精简版本。

  • 1、仔细区分pointers和references
    • 使用引用的情况:
      • 一旦代表的该对象就不能改变,应该选择reference(优势是使用时不需要判是否空)。
      • 实现一个操作符时,为了方便读写,返回引用
    • 其他任何时候,用pointers
  • 2、最好使用C++转型操作符
    • 个人见解:在性能要求不高的地方尽量使用C++转型操作符,以降低阅读、维护成本。不在极高频调用的代码中使用,以降低机器成本
  • 3、绝对不要以多态方式处理数组(std::array)
    • 核心是不要在std::array中存派生类对象,然后传给处理array[基类]的函数。因为传入后,在以下两个场景使用是有问题的
    • array遍历元素,是按照指针类型做间隔(派生类比基类大,会导致偏移错误)
    • 通过基类指针删除一个派生类构成的数组,在C++中是未定义的。
    • 常用的正确的做法是用vector,存储基类指针(派生类对象永远不要直接赋值给基类对象,会导致部分覆盖)
    • 个人见解:在业务代码中放弃使用std::array,固定长度的数组意味着一旦改变就意味着重启。且在大部分场景性能收益不大
  • 4、非必要不提供默认构造函数(不要参数的,系统默认创建的构造函数)
    • 《more effective cpp》作者认为两种情况下是必要的
      • A a[10],放在数组中,没有办法进行传参初始化(不过这个场景并不常用,即使用,也是低频场景,这个时候用,使用vector + for循环初始化,也是够用的)
      • 基类没有默认初始化函数时,派生类需要在构建时,需要显示初始化基类
    • 个人理解
      • 同上一条类似,放弃a[10]这种原始数组,使用std::vector。
      • 做为基类,有一个默认构造函数,可以节省一些代码,特别是继承层数比较多的情况
  • 5、不要提供转换函数
    • 单自变量的构造函数和隐式转换操作符(如operator double()),会提供隐式转换的功能
    • 尽量不要提供隐式转换的功能,如在cout << a时,如果a本身没有写<<操作符,但是a能隐式转换类型,则会先转换类型,再调用该类型的 <<。这类操作很容易出现不符合预期的结果。
    • 用explicit来禁止,单变量的构造函数的隐式转换
  • 6、区别++、--的前置和后置的区别
    • A& operator++() 返回自身。【前置++i】
    • const A operator++(int) 返回一个当前对象的copy,然后对自身对象+1。【后置i++】
    • 个人见解:在循环时,永远使用前置。在业务逻辑中,不管是前置还是后置,都单独写一行,性能一样,且代码更易读,放弃if(fun(a++))这种写法。改为if(run(a)) & a++
  • 7、千万不要重载 && ,|| 和,
    • 实际用的时候,期望 &&前面失败后面就不执行,但是重载的时候做不到
  • 8、了解各种不同意义的new和delete
    • new
      • new operator:
        • 说明:语言内构建,不能被改变意义,总是做相同的事:1、分配足够的内存 2、调用构造函数给分配的内存设定初值。可以改变实现方式,但是不能改变函数步骤和语义
        • 例子: A* a = new A();
      • operator new:
        • 说明:这是一个函数,可以被重写或者重载,它除了内存分配,不会做任何事情,形式为:void* operator new(size_t size);
        • 例子: void* rawMemory = operator new(sizeof(A));
      • placement new
        • 将已有对象,构建在指定内存地址上
        • 例子:void *buffer = operator new(sizeof(int)); new (buffer) A a;
        • 这里获取buffer时,调用一个 void* operator new(size_t)函数,得到一个内存空间
        • 然后调用void operator new(size_t, void* local) {return loacl},并在该函数返回的指针上面调用构造函数
    • delete
      • 当使用placement new时,要先调用析构函数,a->~A(); 然后再调用自己写的函数,释放内存,毕竟只有自己知道内存空间是如何创建的
    • 个人见解:放弃为了性能overwrite new/delete,使用tcmalloc或者jecmalloc。参考我的文章《c++的高性能内存管理库tcmalloc和jemalloc》
  • 9、利用destructors避免泄漏资源
    • 本质就是把heap指针,放到栈上对象,保证释放时,内存也会被释放。如智能指针
  • 10、防止constructor泄漏资源
    • 本质相同,就是用stack对象管理heap对象,也就是对象的所有heap的成员对象,都用智能指针管理

下一篇:《More Effective C++》- 极精简版 11-20条

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/420567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何系统性的学习推荐系统?

推荐一本适合推荐系统、计算广告、个性化搜索领域的从业人员阅读的书&#xff1a;《互联网大厂推荐算法实战》。快手公司算法专家10余年的实战经验总结。涵盖一线互联网公司当前采用的主流推荐算法&#xff0c;凸显可用性、实用性提供从算法基本原理&#xff0c;到技术框架再到…

python语言1

一、pytho中的注释 1.1注释的理解 程序员在代码中对代码功能解释说明的标注性文字可以提高代码的可读性注释的内容将被python解释器忽略&#xff0c;不被计算机执行 1.2注释的分类 注释分为&#xff1a;单行注释、多行注释、中文声明注释 &#xff08;1&#xff09;单行注…

java项目打包运行报异常:xxxxx-1.0-SNAPSHOT.jar中没有主清单属性

pom.xml中加入这段话即可 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.4</version><executions><execution><…

雨云:为你拨开云雾见青天

一、雨云品牌概览 雨云&#xff0c;这名字一听就让人联想到蓝天白云&#xff0c;清爽自然。那么&#xff0c;这个品牌是否真的如其名&#xff0c;能为我们这些在数字世界中漂泊的旅人提供一片宁静、稳定的“云”呢&#xff1f;接下来&#xff0c;让我们深入了解雨云的资质、能…

【Micropython教程】I2C的使用

文章目录 前言一、I2C的使用1.1 分析一种情况1.2 初始化I2C总线1.3 扫描可用的I2C设备1.4 向指定地址写入数据1.5 读取指定地址的数据1.6 关闭I2C总线 二、示例代码总结 前言 MicroPython 是一种精简的 Python 实现&#xff0c;旨在运行在微控制器和嵌入式系统上。在嵌入式开发…

AVL 树

AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决…

vue3的router

需求 路由组件一般放在&#xff0c;pages或views文件夹, 一般组件通常放在component文件夹 路由的2中写法 子路由 其实就是在News组件里面&#xff0c;再定义一个router-view组件 他的子组件&#xff0c;机会渲染在router-view区域 路由传参 <RouterLink :to"/news…

腾讯云最新活动_腾讯云促销优惠_代金券-腾讯云官网入口

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

xsslabs第七关

源码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#xff01;"…

《2023年勒索软件攻击态势报告》

获取方式&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1zd-yVsuGwJADyyGNFR_TIQ?pwd2lo0 提取码&#xff1a;2lo0

游戏空间划分技术

一、 前言 空间划分算法有很多&#xff0c;比如均匀网格&#xff0c;四/八叉树&#xff0c;k-d树&#xff0c;Bsp树&#xff0c;每一种算法都有自己的优缺点&#xff0c;我们需要从理论上理解这些算法&#xff0c;然后在实际项目中进行灵活的运用。 游戏中经常使用空间划分算…

k8s二进制部署的搭建

1.1 常见k8s安装部署方式 ●Minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习、预览K8S的一些特性使用。 部署地址&#xff1a;Install Tools | Kubernetes ●Kubeadm Kubeadm也是一个工具&#xff0c;提供kubeadm init…

【前端素材】推荐优质后台管理系统网页Hyper平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;通常由管理员使…

Charles抓包 - 安装、激活、证书配置

最近刚好又遇到了抓包的需求&#xff0c;之前一直使用 Fiddler 抓包&#xff0c;这几年一直听大家都在用 Charles 抓包&#xff0c;正好一起了解下&#xff08;一般建议掌握一种抓包方式即可&#xff0c;都可以解决同种需求场景&#xff09; 抓包 Fiddler抓包 Charles 下载、安…

深度解读篇章:剖析构建互联网大厦的基石——TCP/IP协议全貌

&#x1f440;&#x1f440;&#x1f440; 引言 今天&#xff0c;我们一同揭幕的是驱动全球互联网脉搏跳动的核心机密——TCP/IP协议体系。没有它&#xff0c;就不会有现今这般高效便捷的网络生活体验&#xff0c;无论在线教育、远程办公&#xff0c;抑或是电子商务、社交媒体…

强大而灵活的python装饰器

装饰器&#xff08;Decorators&#xff09; 一、概述 在Python中&#xff0c;装饰器是一种特殊类型的函数&#xff0c;它允许我们修改或增强其他函数的功能&#xff0c;而无需修改其源代码。装饰器在函数定义之后立即调用&#xff0c;并以函数对象作为参数。装饰器返回一个新…

Docker容器与虚拟化技术:OpenEuler 部署 docker容器应用

目录 一、实验 1.环境 2.OpenEuler 安装 docker 2.镜像加速 3.docker部署LAMP 二、安装docker报错 2.docker如何快速删除容器与镜像 3.docker创建mysql容器失败 4.docker创建apache容器失败 5.docker创建php-fpm容器失败 6. 80端口与php访问失败 7.httpd容器进入不…

【刷题】Leetcode 1609.奇偶树

Leetcode 1609.奇偶树 题目描述广度优先搜索&#xff08;BFS&#xff09;深度优先算法&#xff08;DFS&#xff09; 思路一&#xff08;BFS&#xff09;思路二&#xff08;DFS&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&a…

【k8s管理--Helm包管理器】

1、Helm的概念 Kubernetes包管器 Helm是查找、分享和使用软件构件Kubernetes的最优方式。 Helm管理名为chart的Kubernetes包的工具。Helm可以做以下的事情&#xff1a; 从头开始创建新的chat将chart打包成归档tgz)文件与存储chat的仓库进行交互在现有的Kubernetes集群中安装和…

【数据库管理系统】Mysql 8.0.36入门级安装

下载地址 官方网址&#xff1a;MySQL 注意事项 建议不要安装最新版本&#xff0c;一般找mysql5.0或mysql8.0系列版本即可&#xff1b;mysq1官网有.zip和.msi两种安装形式&#xff1b;zip是压缩包&#xff0c;直接解压缩以后使用的&#xff0c;需要自己配置各种东西&#xff…