《More Effective C++》- 极精简版 11-20条

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


        继续上一篇《More Effective C++》- 极精简版 1-10条。本章我会继续讲解我对11-20条的极精简的理解。

  • 11、不要让destructor的异常流出
    • 先保障不会抛出异常,如果不能,就使用try catch,这里的注意catch里面不再抛出异常也需要人来保证
  • 12、抛出一个exception VS 传递一个参数 VS 一个虚函数之间的差异
    • 异常机制的个人见解异常机制核心收益是减少了用户对三方库的理解成本。在业务代码中使用try-catch包住异常,以让三方库的异常在有限的范围内,并且业务代码的函数执行状态由返回值表示。如果记不住繁琐的异常机制,记住我说的这个原则就够了。
    • 调用函数时,控制权会回到调用端,但是异常不会
    • exception objects总是被复制,如果以by value捕获,会被复制两次
    • throw 的exception对象,使用的静态类型,而不是动态类型
    • catch子句,会在第一次匹配成功时执行
    • 虚函数总是找到最匹配的,而不是第一个匹配的
  • 13、以by reference方式捕捉exceptions
    • by point要担心当前point是否可用
    • by value有复制成本
  • 14、明智使用excpetion specification
    • 个人见解:这个规则已经不适合c++11及之后的版本。忘记它,考虑第12条中我给出的建议
  • 15、异常处理的成本
    • exception是c++的一部分,即使你从未使用,只要有一个依赖库用了,就有了一些成本。如果不要,需要对编译器明确禁止
    • 整体try语句快,代码膨胀5%-10%,速度下降5%-10%
    • exception成本较高,但是它出现的频率是极低的,比正常情况慢3个数量级。
    • 注意,这个性能的变换,more effective cpp的作者也是根据部分测试结果来判断的,它很难推断,而是需要测试验证。
  • 16、80-20法则
    • 用性能测试工具找到性能瓶颈,然后花80%的精力优化20%
  • 17、缓式评估
    • 写时复制,如String s1 = "a"; String b = "a",编译器可能会只有在b使用时,才进行真正的复制。这也是变量定义贴近使用句子的道理
    • 区分读写,cout << a[0]为读,a[0] = 'a'为写。operator并不能区分,但是通过proxy class可以做到(30条)
    • 个人见解:核心思想是,等到确定真正要用的时候才做计算。它并不能减少需要计算数据的计算量,而是尽量不做不需要结果的计算
      • 如矩阵的class operator* 并不是真正的相乘,而是记录所需信息。而是在operator[],才真正的做计算
  • 18、分期摊还预期的计算成本
    • 当预期部分数据被频繁需要时,提前计算。如vector每次预分配的内存,是当前的两倍
  • 19、了解临时对象的来源
    • 临时变量不是局部变量,临时变量并没有名字
    • 两种来源:隐式转换作为函数参数、函数返回对象时
      • char* a = (str_ + "end").c_str(); a指向了一个临时对象(注意不是局部变量),随时可能改变
  • 20、协助完成“返回值优化”
    • 个人见解:在现代C++中,函数返回对象时,编译器会先尝试使用RVO,不行会先考虑使用移动构造函数,最后才是拷贝构造函数。所以,对于c++的默认对象或者小对象,直接返回,编译器会帮助用户只拷贝一次,对于大的对象建议还是在栈上申请,通过指针传递

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络(2)-----数据链路层

目录 一.数据链路层的基本概念 二.数据链路层的功能概述 功能一:为网络层提供服务。无确认无连接服务&#xff0c;有确认无连接服务&#xff0c;有确认面向连接服务。 功能二:链路管理&#xff0c;即连接的建立、维持、释放(用于面向连接的服务)。 功能三:组帧 透明传输:…

ESU毅速丨不锈钢材料为什么在金属3D打印中的广泛应用

不锈钢是一种传统且常见的材料&#xff0c;在金属3D打印领域应用最广。那么&#xff0c;为何不锈钢材料在3D打印中如此受欢迎呢&#xff1f;以下是几个关键原因。 卓越的工艺适应性 金属3D打印技术&#xff0c;如直接金属激光烧结&#xff08;DMLS&#xff09;和选择性激光熔融…

Redis--持久化机制详解

什么是redis持久化&#xff1f; Redis持久化是将内存的数据持久化到磁盘上&#xff0c;防止Redis宕机或者断点的时候内存中的数据丢失&#xff0c;把内存中的数据写入到磁盘的过程叫持久化。 Redis持久化的方式&#xff1f; RDB&#xff08;Redis DataBase&#xff09;&…

全量知识系统问题及SmartChat给出的答复 之10 三套工具之5语法解析器之3

Q27. 从前面可以看出&#xff0c;IPP解析器给出两种文法规则&#xff0c;一种是人工的&#xff08;文字处理和文本理解&#xff09;&#xff0c;一种是机器的&#xff08;图形算法和图像处理&#xff09;。前者可以是一套文写文章的注释工具的底层&#xff0c;可以使用颜色来着…

Jmeter分布式部署

前期准备&#xff1a; 1. 控制机一台&#xff0c;代理机一台&#xff0c;Jmeter安装包 操作步骤&#xff1a; 1. Linux安装Jmeter&#xff08;windows安装教程自己搜一下&#xff09; 1.1创建一个单独的文件夹(jmeter)&#xff0c;用来存放Jmeter的安装包 mkdir jmeter 1.2…

centos7升级openssl_3

1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…

vscode设置打开浏览器

安装这个插件 Open Browser Preview

全排列 全排列 II N皇后

46.全排列 力扣题目链接(opens new window) 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 递归终止条件&#xff1a;当收集元素的数组path的大小达到和nums数组…

CSP-201803-1-跳一跳

CSP-201803-1-跳一跳 解题思路 使用getline函数接收一行输入&#xff0c;即玩家的跳跃序列。初始化总得分scoreSum为0&#xff0c;上一次得分lastGrade为2&#xff08;因为跳到中心的初始得分是2&#xff09;&#xff0c;以及一个布尔标志flag表示上一次是否跳到了中心&#…

Thinkphp框架漏洞--->5.0.23 RCE

1.Thinkphp ThinkPHP是一个免费开源的&#xff0c;快速、简单的面向对象的轻量级PHP开发框架&#xff0c;是为了敏捷WEB应用开发和简化 企业应用开发而诞生的。 2.漏洞原理及成因 该漏洞出现的原因在于 ThinkPHP5框架底层对控制器名过滤不严 &#xff0c;从而让攻击者可以通过…

lotus 从矿工可用余额扣除扇区质押

修改 miner配置文件 # Whether to use available miner balance for sector collateral instead of sending it with each message## type: bool# env var: LOTUS_SEALING_COLLATERALFROMMINERBALANCE#CollateralFromMinerBalance falseCollateralFromMinerBalance true质押金…

(Sora模型风口)2024最新GPT4.0使用教程,AI绘画,一站式解决

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

代码随想录算法训练营第10天| 232. 用栈实现队列、225. 用队列实现栈

232. 用栈实现队列 题目链接 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 思路 记得是用两个栈实现的队列&#xff0c;但是细节记不太住&#xff0c;看了视频才勉强缝缝补补做出来。 本人题解 class MyQueue { public:stack<int> stackIn;stack<…

【C语言】动态内存管理常用函数

前言 我们在之前学习的数组开辟的空间是固定不变的&#xff0c;有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道~ c语言中的动态内存开辟&#xff0c;让程序员⾃⼰可以根据实际需求申请和释放相应空间&#xff0c;这使得空间的开辟变得灵活了许多。 欢迎关注个人主页&#x…

小程序配置服务器域名的操作步骤(入门级)

将详细列出小程序配置服务器域名的操作步骤&#xff1a; 服务器选购推荐&#xff1a;腾讯云轻量服务器 点击以下任一云产品链接&#xff0c;跳转后登录&#xff0c;自动享有所有云产品优惠权益&#xff1a; 经过笔者亲测&#xff0c;强烈推荐腾讯云轻量应用服务器作为游戏服…

微服务简介及其相关技术栈

目录 1、简介 2、技术栈 3、单体架构 4、分布式架构 5、微服务 6、总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Pyth…

【QT+QGIS跨平台编译】之五十七:【QGIS_CORE跨平台编译】—【VECTOR_TILE生成】

文章目录 一、protoc二、生成来源三、构建过程一、protoc Protocol Buffers(简称 protobuf)是一种轻量级、高效的数据序列化框架,它可以将结构化数据序列化为二进制格式,同时还可以进行反序列化和数据压缩。相比于 XML 和 JSON 等传统的文本序列化格式,protobuf 采用二进制…

wpa_supplicant交叉编译

文章目录 源码编译openssl编译libnl交叉编译WPA 开发板测试使用 源码 wpa_supplicant官网&#xff1a;http://w1.fi/wpa_supplicant/ GIT源&#xff1a;git://w1.fi/hostap.git openssl 源码&#xff1a; https://www.openssl.org/ libnl 源码&#xff1a; https://github.c…

自定义preference的使用

自定义preference的使用 control_iconsize_preference_top.xmlcontrol_iconsize_preference_middle.xmlcontrol_iconsize_preference_bottom.xmlcontrol_iconsize_preference_airplane.xmlcontrol_iconsize_preference_no_arrow_top.xmlcontrol_iconsize_preference_no_arrow_m…

3 开源鸿蒙OpenHarmony4.1源码下载、编译,生成OHOS_Image可执行文件的最简易流程

开源鸿蒙OpenHarmony4.1源码下载、编译&#xff0c;生成OHOS_Image可执行文件的最简易流程 作者将狼才鲸日期2024-03-01 准备一台Windows电脑 安装VMware或者VMware Player虚拟机 从华为镜像下载Ubuntu系统&#xff0c;用国内源下载速度更快 Ubuntu 镜像说明https://repo.hu…