《Effective C++》- 极精简版 41-55条

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


        继续上篇《Effective C++》- 极精简版 31-40条。本文列出《Effective C++》的41-55条的个人理解的极精简版本。

  • 40、谨慎使用多重继承
    • 个人见解:这是一个性价比不高的功能,容易出错,且收益不高。java语言中也没有多继承。放弃它吧。
  • 41、了解隐氏接口和编译期多态
    • 基类纯虚函数,子类就可以实现这个纯虚函数,保证所有继承该基类的子类都有相同的接口
    • 编译器多态:函数重载、模版、宏可以实现。
    • 个人见解:放弃编译时期宏的多态,容易出错,且难以维护
  • 42、了解typename的双重含义
    • 声明template参数时,关键字class和typename的意义完全相同
    • 在模版中,要使用A的嵌套类,需要用typename A::xx。否则编译器无法确定xx是嵌套类还是成员变量
    • typename不能修饰继承的基类列表和成员函数初始化列表(其实是因为这两个地方语义已经明确,不需要区分)
    • 个人见解:向STL源码学习,模版使用关键字typename + 模版中使用嵌套类时前面加上typename
  • 43、学习处理模版化基类内的名称
    • 继承模版基类时,必须是继承特化的基类。如果想使用非特化的基类函数,用this->Base_fun()。
  • 44、将于参数无关的代码抽离template
    • 核心考虑如果,各个模版实例化后,都会调用相同成员函数逻辑,而diff仅仅是参数值不同,那可以考虑这个成员函数以输入参数的形式,而不是模版参数的形式,防止二进制膨胀
    • 如template<typename T, size_t n>,这里的n尽量不要作为模版参数,否则容易生成特别的实际代码,导致二进制很大。不要让模版数量和参数值产生依赖关系
    • 个人见解:除需要类型判断的变量,能写成函数参数的,就不用模版参数。
  • 45、让成员函数接受所有兼容的类型
    • 个人见解:同一个成员函数对不同类型处理逻辑一样时,用模版,而不是overload
  • 46、需要类型转换时请为模版定义非成员函数
    • 对operator*,如24条,只有定义为非成员函数才能 2*a完成隐式转换。但是必须是friend函数,才能在template形式的类完成类型推导。但是模版的声明和定义要在一起,所以这个时候需要一个在class内部的friend模版函数
  • 47、traits class表现类型信息
    • 这里使用traits,是为了在编译时知道模版传进来的参数类型。理论上可以用传入的对象的参数,但是为了同时适配内置类型,C++遵守一个共同的协议,通过typedef在特化模版函数中写,通过typeid()函数读。
    • 个人见解:尽量不使用,而是使用基类的成员变量来判断。因为typeid 会引入运行时开销
  • 48、认识模版元编程TMP(template metaprogramming)
    • 概念:是由c++写的,执行于c++编译器内的程序。它的输出是若干c++源码
    • 优势:更小的可执行文件、较短的运行周期、较少的内存需求。
    • 个人见解:部分场景有性能收益,但是维护成本高,代码不易读,更长的编译时间。
  • 49、了解new-handler的行为
    • operator new无法满足内存分配需求时,operator new会抛出异常,在抛出异常之前,会先调用用户通过set_new_handler指定的void ()函数。
    • 个人见解:不常用,内存分配不出来的时候,服务大概率以及接近不可用的状态了。
  • 50、了解new和delete的合理替换时机
    • 用来检测运用上的错误、为了强化效率、为了收集使用上的统计数据
    • 为了效率,比如tcmalloc、jemalloc
    • 个人见解:在海量数据处理的服务,对性能提升很大,十分重要。可以参考我之前写的《c++的高性能内存管理库tcmalloc和jemalloc》
  • 51、编写new、delete时需要固守的常规
    • 个人见解:不要改,用tcmalloc或jemalloc的
  • 52、重新定义new之后,一定要重新定义delete
    • 个人见解:不要改,能绕过就绕过
  • 53、不要忽略编译器的警告
    • 个人见解:三方库质量、版本参差不齐,告警十分常见。实践中只关注自己的代码告警吧,稳定性依赖其他方式,一个个解决三方库的告警,是在浪费时间
  • 54、让自己熟悉包括TR1在内的标准库
    • 独立机制:shared_ptr、function、bind、Hash tables、正则表达式、Tuples、array、mem_fn、reference_wrapper、随机数生成工具、数学特殊函数
    • template编程技术:Type traits、result_of
  • 55、熟悉boost

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

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

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

相关文章

代码随想录训练营总结篇

1:刚开始学习了数据结构的时候,碰到一些树图等有点畏难,感觉刷力扣跟是一件恐怖的事情 2:在网上找了很多关于数据结构与算法的视频讲解,有听进去,但是自己动手写有点困难 3:碰到一些比较复杂的问题时需要与人讨论,加了一些代码随想录中的群,发现这里是学习算法 的天堂,大家都…

【深度学习笔记】深度卷积神经网络——NiN

网络中的网络&#xff08;NiN&#xff09; LeNet、AlexNet和VGG都有一个共同的设计模式&#xff1a;通过一系列的卷积层与汇聚层来提取空间结构特征&#xff1b;然后通过全连接层对特征的表征进行处理。 AlexNet和VGG对LeNet的改进主要在于如何扩大和加深这两个模块。 或者&am…

Android 14 权限

问题Android 14 按照视频播放类的应用 无法获取到权限。 原因是从 Android 13 开始&#xff0c;如果你的应用程序 targetSdk 指定到了 33 或以上&#xff0c;那么 READ_EXTRERNAL_STORGE 权限就完全失去了作用&#xff0c;申请它将不会产生任何效果。 与此相对应的&#xff0c…

C编程学习资源汇总

Study Soures Pool 基础:推荐 C Primer Plus 第6版 中文版 + C Primer Plus 第6版 中文版习题解答 进阶:推荐使用小甲鱼的学习视频,课程细致,而且免费,资源很丰富。 首页:鱼C工作室-免费编程视频教学|Python教学|Web开发教学|全栈开发教学|C语言教学|汇编教学|Win32开发…

诉诸存储和传输的编码

用脑补而不是重传对有损传输进行纠错 后&#xff0c;有朋友评论&#xff1a; 可现代的图像压缩、数据编码已经很大程度上把可以脑补的空间从传输载荷中沥干了——完美编码下所传输的数据是近乎噪声的没有任何特点的分布。在这个框架下&#xff0c;被压缩的载荷如果随便丢了一点…

Linux------进程地址空间

目录 一、进程地址空间 二、地址空间本质 三、什么是区域划分 四、为什么要有地址空间 1.让进程以统一的视角看到内存 2.进程访问内存的安全检查 3.将进程管理与内存管理进行解耦 一、进程地址空间 在我们学习C/C的时候&#xff0c;一定经常听到数据存放在堆区、栈区、…

4、正则表达式、本地存储

一、正则表达式 1、定义 用事先定义好的一些特定字符&#xff0c;这样的字符组合&#xff0c;组合成一个“规则字符串” 2、正则的组成 特殊字符 字母、数字、下划线、中文、特殊字符… 元字符&#xff08;常用&#xff09; 1、\d 匹配至少有一个数字 var reg /\d/ /…

2024Java面试题一

目录 问题&#xff1a; 答案&#xff1a; 问题&#xff1a; 什么是Java中的多态性&#xff08;Polymorphism&#xff09;&#xff1f;Java中的重载&#xff08;Overloading&#xff09;和重写&#xff08;Overriding&#xff09;有什么区别&#xff1f;什么是Java中的抽象类&…

XGB-13:使用 XGBoost 外部内存版本

在处理大型数据集时&#xff0c;训练 XGBoost 模型可能会面临挑战&#xff0c;因为整个数据集需要加载到内存中。这可能成本高昂&#xff0c;有时也难以实现。从版本 1.5 开始&#xff0c;用户可以定义自定义迭代器以按块加载数据来运行 XGBoost 算法。外部内存可以用于训练和预…

每日一题Acwing-借教室

503. 借教室 - AcWing题库 想到了差分没想到二分法。同时注意INT的范围是10位。 #include<iostream> using namespace std; int n,m; const int N 1e610; int r[N],s[N],d[N],t[N]; long long b[N]; bool check(int mid){for(int i1;i<n;i){b[i]r[i]-r[i-1];}for(…

SpringBoot整合rabbitmq-直连交换机队列(二)

说明&#xff1a;本文章主要是Direct定向/直连类型交换机的使用&#xff0c;它的大致流程是将一个队列绑定到一个直连交换机上&#xff0c;并赋予一个路由键 routingkey&#xff0c;当一个消息携带着路由值为routingkey&#xff0c;这个消息通过生产者发送给交换机时&#xff0…

【冲击蓝桥篇】动态规划(下):你还在怕动态规划!?进来!答题模板+思路解析+真题实战

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

【vue】vue 是怎么把 template 模版编译成 render 函数的,什么是AST抽象语法树

什么是AST 抽象语法树 是一个对象/或者json是一个数据结构 AST通常是由多个节点组成的树状结构&#xff0c;每个节点代表一个语法单位或表达式。节点之间的关系通过父子关系或兄弟关系来表示程序的结构。在不同的编程语言和工具中&#xff0c;AST可能有不同的表示方式和节点类…

Python中检查一个数字是否是科技数的完整指南

目录 前言 什么是科技数&#xff1f; 如何判断一个数字是否是科技数&#xff1f; 分割数字并计算平方 Python实现科技数检测的示例代码 科技数的应用场景 1. 数字游戏 2. 数据处理 3. 算法优化 4. 数据结构设计 总结 前言 科技数&#xff08;Tech Number&#xff09;是一…

(二十三)Flask之高频面试点

目录&#xff1a; 每篇前言&#xff1a;Q1&#xff1a;为什么把request和session放在一起&#xff1f;Q2&#xff1a;Local对象的作用&#xff1f;Q3:&#xff1a;LocalStack对象的作用&#xff1f;Q4&#xff1a;一个运行中的Flask应用程序分别包括几个Local/LocalStack&#…

若依前后端分离版开源项目学习

前言&#xff1a;vscode中vue代码没有高亮显示&#xff0c;可以下载vetur插件解决&#xff0c;ctrl点击无法跳转函数定义问题&#xff0c;可以下载vue-helper插件解决&#xff1b;idea中ctrl点击函数即可跳转函数定义。 一、登录 1.生成验证码 基本思路&#xff1a; 后端生…

vue a-table 实现指定字段相同数据合并行

vue a-table 实现相同数据合并行 实现效果代码实现cloums数据格式数据源格式合并代码 实现效果 代码实现 cloums数据格式 const getColumns function () {return [{title: "分类",dataIndex: "checked",width: "150px",customRender: (text, …

JMeter--9.录制脚本

录制步骤 1.新建线程组&#xff1a;测试计划->线程->线程组 测试计划下&#xff0c;至少要有1个线程组&#xff0c;因为在录制器中需要选择【目标控制器】 2. 新建录制器&#xff1a;测试计划->非测试原件->HTTP(S)测试脚本记录器&#xff08;HTTP代理服务器&…

【vue】vue2 和 vue3 的区别,响应式/性能提升/渲染函数/插槽

vue2/vue3 的对比 响应式原理 vue2 使用 definePropertyvue3 使用 proxyapi vue2 是选项式 options API 基于对象的方式&#xff0c;将组件的选项 data&#xff0c;methods 等作为组件实例属性代码逻辑比较复杂&#xff0c;难以维护data 必须是函数使用 mixin 复用相同逻辑 命…