《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的成员对象,都用智能指针管理

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

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

相关文章

微信小程序的医院食堂订餐系统uniapp+vue+springboot/django/php

针对患者订餐的管理现状&#xff0c;本微信小程序的患者订餐主要实现以下几个目标&#xff1a; 1.系统界面简洁&#xff0c;操作简便。 2.拥有精准&#xff0c;高效的查询功能。 3.能使管理人员能够及时的获得精确的信息。 4.对数据内容的管理安全&#xff0c;…

安卓websocket(客服端和服务端写在app端) 案例

废话不多说直接上代码 首选导入 implementation "org.java-websocket:Java-WebSocket:1.4.0" package com.zx.qnncpds.androidwbsocket;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button;import a…

腾讯:《智能科技 跨界相变——2024数字科技前沿应用趋势》

1月23日&#xff0c;腾讯发布了题为《智能科技 跨界相变——2024数字科技前沿应用趋势》的报告&#xff0c;报告从计算重塑、智能升维、沉浸交互、未来连接四个方面&#xff0c;对100多项未来技术和重点方向给出了趋势性判断。并表示我们正驶向一个由连接衍生交互、由计算催生智…

把简单留给用户,把复杂交给 AI

2024 年伊始&#xff0c;Kyligence 联合创始人兼 CEO 韩卿&#xff08;Luke&#xff09;分享了对 AI 与数据行业的一些战略思考&#xff0c;以及对中美企业服务市场的见解&#xff0c;引发业界同仁的广泛共鸣。正值 Kyligence 成立 8 周年&#xff0c;恰逢 AI 技术应用风起云涌…

leetcode 2.29

Leetcode hot100 二分查找1. 搜索插入位置2. 搜索二维矩阵 二分查找 1. 搜索插入位置 搜索插入位置 标准二分的写法&#xff1a; 复杂度分析 时间复杂度&#xff1a;O(log⁡n)&#xff0c;其中 n 为数组的长度。二分查找所需的时间复杂度为 O(log⁡n)。 空间复杂度&#xff1…

FLask会话技术和Flask模板语言

二、FLask会话技术和Flask模板语言 1.会话技术 cookie 客户端的会话技术&#xff1a;让服务器认识浏览器&#xff0c;常用于登录 cookie本身由浏览器保存&#xff0c;通过Response将cookie写到浏览器上&#xff0c;下一次访问&#xff0c;浏览器会根据不同的规则携带cookie过…

ssm656基于JAVA的校园失物招领平台的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1 课题…

(k8s中)docker netty OOM问题记录

1、首先查看docker的内存占用情况&#xff1a; docker top 容器名 -u 查看内存cpu占用率&#xff08;容器名来自kubectl describe pod xxx或者docker ps&#xff09; 可以看出内存一直增长&#xff0c;作为IO代理这是不正常的。 2、修改启动参数和配置文件 需要注意的是为了…

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.01.01-2024.01.10

论文目录~ 1.RoboFusion: Towards Robust Multi-Modal 3D obiect Detection via SAM2.Aligned with LLM: a new multi-modal training paradigm for encoding fMRI activity in visual cortex3.3DMIT: 3D Multi-modal Instruction Tuning for Scene Understanding4.Incorporati…

电子科技大学课程《计算机网络系统》(持续更新)

前言 本校的课程课时有所缩减&#xff0c;因此可能出现与你学习的课程有所减少的情况&#xff0c;因此对其他学校的同学更多的作为参考作用。本文章适合学生的期中期末考试&#xff0c;以及想要考研电子科技大学的同学&#xff0c;电子科技大学同学请先看附言。 第一章 计算…

Unity - SerializeReference特性

作用&#xff1a;在编辑器面板上持久序列化一个接口或者抽象类对象 特点&#xff1a; 1.添加SerializeReference后, 即使字段是私有的, 也无需添加SerializeField属性, 二者同有将私有字段序列化的能力. 2.SerializeReference属性允许字段为null, 这点与默认序列化行为不同,…

Angular ts中监听变量

这边有个需求&#xff0c;需要监控某个input的变量变化&#xff0c;突然忘记怎么监听变量了&#xff0c;查了下&#xff0c;记录 这边使用angluar/core中的OnChanges接口&#xff0c;然后实现 ngOnChanges方法&#xff0c;只要变量发生了变化&#xff0c;这里面都可以监听到&am…

苹果手机如何下载微信视频号的视频?亲测可用的方法!

以下是如何下载微信视频号的视频的办法&#xff0c;首先是视频号下载提取器&#xff0c;下载视频号视频的&#xff01; 需配合微信PC版或者手机进行操作。这里以苹果手机为例 首先&#xff0c;你需要在视频号频道找到你想要下载的视频&#xff0c;然后通过点击选择你需要播放的…

[Android View] 可绘制形状 (Shape Xml)

一切以官方文档为主 官方文档https://developer.android.com/guide/topics/resources/drawable-resource?hlzh-cn#Shape 什么是可绘制形状 可以理解为用xml文件来描述一个简单的Drawable图形&#xff0c;比如说以下这段xml就可以用来描述一个白色的圆形&#xff1a; <?…

Centos中安装Docker及Docker的使用

在centos7系统中安装指定版本的docker,并通过docker使用安装mysql为例,阐述docker的使用。 2.1、Docker卸载及安装yum依赖 【卸载Docker,如果安装的Docker的版本不合适】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…

智能汽车软硬件产品CES展示汽车技术新亮点

智能汽车是汽车产业发展的新趋势&#xff0c;是未来汽车发展的必然方向。智能汽车是指搭载了先进的传感器、控制器、执行器等部件&#xff0c;并融合了人工智能、自动驾驶等技术&#xff0c;能够实现部分或完全自动驾驶、智能网联等功能的汽车。 近年来&#xff0c;智能汽车技…

抖店怎么开店注册?新手需要准备什么?这几个步骤很关键!

我是电商珠珠 不少人瞄准了抖店这个短视频电商势头&#xff0c;想要在今年大干一场。关于抖店注册这方面&#xff0c;部分人还不太清楚&#xff0c;今天我就带大家一步步注册&#xff0c;看一遍就会了。 前期准备资料 前期新手的话&#xff0c;需要准备一张个体工营业执照&a…

Java实战:Web实时消息推送技术

一、引言 随着互联网技术的飞速发展和用户对实时交互体验的追求&#xff0c;Web实时消息推送已成为众多在线平台的核心功能之一。无论是社交网络的新消息通知、协同办公工具的实时更新&#xff0c;还是电商平台的订单状态变更&#xff0c;都需要实时、准确地将信息推送到用户的…

【Java设计模式】二、单例模式

文章目录 0、单例模式1、饿汉式2、懒汉式3、双重检查4、静态内部类5、枚举6、单例模式的破坏&#xff1a;序列化和反序列化7、单例模式的破坏&#xff1a;反射8、单例模式的实际应用 设计模式即总结出来的一些最佳实现。GoF(四人组) 书中提到23种设计模式&#xff0c;可分为三大…

B站画质补完计划(2):视频超分让像素细腻生动

本期作者 1 前言 为了给用户提供更清晰的画质体验&#xff0c;B站自研的超分辨率算法已经在站内广泛应用&#xff0c;支持了如《赛马娘》、《流浪地球2》、《权力的游戏》、英雄联盟S赛赛事直播等知名番剧、电影电视剧以及重要游戏赛事直播的 4K 视频流生产。 2 超分算法的应用…