C++技能基础:提升C++程序运行效率的方法总结

news2024/9/28 5:27:08

以下是一些编程方面的建议,目的是为了提升C++程序的效率(这里的效率以时间为评判标准),欢迎指正和补充

  1. 场景:当设计方法时,将方法设计成值传递还是引用或者指针传递
    建议:当变量所占内存大小与指针所占内存差别不大时(int、double),值传递和引用、指针传递的效率一样,当值传递明显要大于8字节时,采用引用、指针传递会更好(string、自定义变量类型)
    原理:当使用引用或者指针时,拷贝的是变量的地址值,大小为8字节,而值传递拷贝的是变量本身
  2. 场景:当需要递增变量时,使用前置递增还是后置递增
    建议:非循环下,由于编译器优化,两者效率一致,无需分别;在循环里面编译器没有进行优化,若只是想要递增一个变量,使用前置递增
    原理:递增运算符有两种,前置递增++i,和后置递增i++,前者直接对变量本身递增,返回的是对变量本身的引用,后者则先拷贝原对象,并返回变量的副本,再对原对象进行递增操作。
  3. 场景:代码1和代码2,哪种方式效率更高?
    建议:调查所使用的变量类型的赋值操作函数和(构造函数+析构函数)哪个开销大
    原理:对于代码1,需要调用ClassTest的构造函数1次,赋值操作函数(operator=)100次;对于代码2,需要高用(复制)构造函数100次,析构函数100次。
  4. 场景:当需要强制类型转换类指针时,使用dynamic_cast还是static_cast
    建议:注重安全性,使用dynamic_cast,注重效率,使用static_cast(目前平台内使用的都是dynamic_cast)
    原理:dynamic_cast会进行类型检查,如果强转的类型不是原指针类型的基类,会返回nullptr,而static_cast直接转换成指定类型,有可能会出错,但不会做检测,效率比较高
  5. 场景:标准库容器查找指定索引的元素时,使用at(i)还是[i]
    建议:注重安全性,使用at(i),注重效率,使用[i]
    原理:at(i)会进行边界检测,保证索引值超过数组的容量时依然是安全的,而[i]不会检测,直接访问根据索引值进行偏移得到的地址值,可能会出错,但效率比较高
  6. 场景:当设计方法时,是否应该将其声明为内联
    建议:小粒度的函数声明为内联
    原理:调用函数需要保护现场,为局部变量分配内存,函数结束后还要恢复现场等,而内联函数则是把它的代码直接写到调用函数处,所以不需要这些开销,但会使程序的源代码长度变大
  7. 场景:初始化一个变量时,使用直接初始化(ClassTest ct1(ct2)),还是复制初始化(ClassTest ct1 = ct2)
    建议:直接初始化
    原理:当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象
  8. 场景:需要使用map或者set时,是使用std::map(set),还是std::unorder_map(unorder_set)
    建议:注重减少空间开销,使用std::map(set),注重减少时间开销,使用std::unorder_map(unorder_set)
    原理:STL中,map对应的数据结构是 红黑树。红黑树是一种近似于平衡的二叉查找树,里面的数据是有序的。在红黑树上做查找操作的时间复杂度为 O(logN)。而 unordered_map 对应 哈希表,哈希表的特点就是查找效率高,时间复杂度为常数级别 O(1), 而额外空间复杂度则要高出许多
  9. 场景:当需要生成一个变量,并将其加入到标准库容器中时,使用push_back还是emplace_back
    建议:使用emplace_back
    原理:push_back和emplace_back耗时比较

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

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

相关文章

浏览器出现 502 Bad Gateway的原理分析以及解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法 前言 此类问题主要作为疑难杂症 1. 问题所示 2. 原理分析 502 Bad Gateway 错误表示服务器作为网关或代理时,从上游服务器收到了无效的响应 通常出现在充当代理或网关的网络服务器上,例如 Nginx、Apache…

学校同步时钟系统实现考场时间统一协调

在学校的教育教学活动中,考试是一项至关重要的环节。而确保考场时间的统一协调,对于保障考试的公平性、准确性和严肃性具有不可忽视的意义。学校同步时钟系统的出现,为解决这一问题提供了高效而可靠的解决方案。 一、学校同步时钟系统是一种通…

新版Android Studio中设置gradle的JDK版本

旧版android studio 在旧版(具体哪个版本号之前搞不清了)中设置JDK版本在>File——>Project Structure——>SDK location——>Gradle Setting——>Gradle SDK 新版android studio 某次更新后发现SDK location下找不到Gradle Setting选项…

kei5l中不能跳转到函数定义的原因和个人遇到的问题

快捷键 CTRLK或F12,在选择要查看的函数定义时按下可以查看到(文件没问题的情况下) 出现不能查看的原因 1,没有设置生成文件信息(第一次打开工程常遇到问题) 2, 定义函数的代码没有加入工程 解决方式如下…

1.DDR3 SO-DIMM 内存条硬件总结

最近在使用fpga读写DDR3,板子上的DDR3有两种形式与fpga相连,一种是直接用ddr3内存颗粒,另一种是通过内存条的形式与fpga相连。这里我们正好记录下和ddr3相关的知识,先从DDR3 SO-DIMM 内存条开始。 1.先看内存条的版本 从JEDEC下载…

在idea中查看某个接口的所有实现类图

一、选中某个接口右键 ---> Diagrams ---> show Diagrams,然后就会进入一个新的 tab 页; 二、然后在出来的图上选中某个接口右键 ---> show Implementations,就会显示选中接口的所有实现类列表; 三、最后 ctrl A 全部选…

苍穹外卖--完善登录功能:进行MD5加密

目标 TODO:使用MD5加密方式对明文密码。 实现 password DigestUtils.md5DigestAsHex(password.getBytes());

CEPH 硬盘读写慢问题影响

ceph使用时经常会碰到起不来的情况 第一种就是服务器负载高,这个基本都会觉察到 还有一种就是硬盘问题 硬盘写问题 初始化时ceph会自己进行填充操作 ceph-volume lvm zap /dev/sdx --destroy 我就碰到过没初始化问题 看着一切正常 但看写入速度才几百KB/s 正常都100…

五款神奇的工作效率工具

大家好呀,今天我要来种草几款让我工作效率翻倍的神器啦!🎈如果你也经常感叹时间不够用,那这些小帮手绝对能让你事半功倍哦!🚀 1️⃣ 亿可达 — 软件连接器🔗 作为一款自动化工具,亿…

运营商如何与第三方服务商合作,共同建设PCDN网络?

运营商与第三方服务商合作,共同建设PCDN(P2P CDN)网络,是一个涉及技术、资源、运营等多方面的复杂过程。以下是一些建议的操作步骤: 一.明确合作目标与业务模式: 1.运营商与第三方服务商首先需…

如果你想手写Linux系统

哈喽,我是子牙老师。今天咱们聊聊这个话题吧,Linux作为当今科技世界的地基,我们越来越接近真理了,有木有? 这个文章的角度,你可能全网都很难找到第二篇如此系统讲透这个问题的文章 你可能想问&#xff1a…

论文辅导 | 基于模态分解的Transformer-GRU联合电池健康状态估计

辅导文章 模型描述 提出一种基于变分模态分解(variational mode decomposition,VMD)与粒子群优化(particle swarm optimization,PSO)的变换神经网络(Transformer)和门控循环单元(gate recurrent unit,GRU)的联合方法。首先将锂电池容量信息通…

科普文:一文搞懂jvm实战(四)深入理解逃逸分析Escape Analysis

概叙 Java 中的对象是否都分配在堆内存中? 好了太抽象了,那具体一点,看看下面这个对象是在哪里分配内存? public void test() { Object object new Object(); }这个方法中的object对象,是在堆中分配内存么&#xff1…

城市地下综合管廊物联网远程监控

城市地下综合管廊物联网远程监控 城市地下综合管廊,作为现代都市基础设施的重要组成部分,其物联网远程监控系统的构建是实现智慧城市建设的关键环节。这一系统集成了先进的信息技术、传感器技术、通信技术和数据处理技术,旨在对埋设于地下的…

免费无限白嫖阿里云服务器

今天,我来分享一个免费且无限使用阿里云服务器的方法,零成本!这适用于日常测试学习,比如测试 Shell 脚本、学习 Docker 安装、MySQL 等等。跟着我的步骤,你将轻松拥有一个稳定可靠的服务器,为你的学习和实践…

数字化打破传统,引领企业跨界经营与行业生态盈利

在当今数字化时代,传统的赚货差思路正面临着巨大的挑战。然而,数字化的崛起为企业提供了突破传统束缚的机会,促使其转向跨界经营,并通过行业生态经营获取利润。 首先,数字化打破了传统赚货差思路的局限性。以往&…

【ARMv8/v9 GIC 系列 5.8 -- SPI 中断路由到指定的 core 详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 SPI 中断路由配置寄存器字段代码示例Usage scenarioSPI 中断路由配置 在ARMv8和ARMv9架构下,当启用亲和性路由(Affinity Routing)时,系统寄存器GICD_IROUTER<n>用于提供具有INTID n的SPI的路由信息。n的最大值由公式(32*…

RocketMQ之消费者,消息拉取流程详解附源码解析

RocketMQ 消费者&#xff08;4&#xff09;消息拉取 流程详解 & 源码解析 1. 背景 本文是 RocketMQ 消费者系列的第四篇&#xff0c;介绍消息拉取的流程。 RocketMQ 的消费主要分推和拉两个模式&#xff0c;拉模式主动拉取消息&#xff0c;整个逻辑比较简单。本文着重介绍…

如何判断ip地址在同一个网段:技术解析与实际应用

在网络世界中&#xff0c;IP地址就像每个人的身份证一样&#xff0c;是识别和定位网络设备的关键。然而&#xff0c;仅仅知道IP地址还不足以完全理解其背后的网络结构和通信方式。特别是当我们需要判断两个或多个IP地址是否位于同一网段时&#xff0c;就需要借助子网掩码这一概…

【linux高级IO(二)】多路转接之select详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux高级IO 1. 前言2. 初识s…