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

以下是一些编程方面的建议,目的是为了提升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.mzph.cn/pingmian/45416.shtml

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

相关文章

SpringBoot整合XXL_JOB示例

XXL-JOB 是一个分布式任务调度平台,主要用于管理和执行定时任务。它适用于各种场景,例如定时任务、批处理任务、分布式任务等。XXL-JOB 提供了丰富的功能,使得任务调度变得简单、高效和可靠。以下是 XXL-JOB 的一些主要功能和特点&#xff1a…

暑假第一次作业

第一步:给R1,R2,R3,R4配IP [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1-Serial4/0/0]ip address 15.0.0.1 24 [R2-GigabitEthernet0/0/0]ip address 192.168.2.1 24 [R2-Serial4/0/0]ip address 25.0.0.1 24 [R3-GigabitEthernet0/0/0]ip address 192.…

程序员标准简历模板

链接: https://pan.baidu.com/s/1yMXGSSNba15b9hMXjA39aA?pwdb4ev 提取码: b4ev 3年工作经验简历 链接: https://pan.baidu.com/s/1OO7n1lRL6AkhejxYC9IyDA?pwdfmvv 提取码: fmvv 优秀学员简历 链接: https://pan.baidu.com/s/106Vkw_ulOInI47_5mDySSg?pwduudc 提取码: uu

Spring Expression表达式使用

Spring Expression 简介 Spring Expression Language(简称 “SpEL”)是一种功能强大的表达式语言,支持在运行时查询和操作对象图。其中最显著的是:方法调用和基本的字符串模板功能。 虽然SpEL是Spring产品组合中表达式评估的基础…

微信公众号注册流程

注册指引 官网 https://mp.weixin.qq.com/ 服务号/订阅号 微信官方注册流程 https://kf.qq.com/touch/faq/150804UVr222150804quq6B7.html?platform15

四个“一体化”——构建数智融合时代下的一站式大数据平台

随着智能化技术的飞速发展,尤其是以生成式AI为代表的技术快速应用,推动了数据与智能的深化融合,给数据基础设施带来了新的变革和挑战。如何简化日益复杂的系统架构,提高数据处理效率,降低开发运维成本,促进…

常用3D建模软件有哪些?如何实现3D模型在线预览?

3D建模是指使用计算机软件或其他工具创建三维物体模型的过程。3D建模大概可分为NURBS和多边形网格两类。NURBS对要求精细、弹性与复杂的模型有较好的应用,适合量化生产用途;多边形网格建模则靠拉面方式,适合做效果图与复杂场景动画。建模方法…

木舟0基础学习Java的第十六天(异常,分类,自定义异常,注意事项)

异常 异常概述:异常是Java程序运行过程中出现的错误 异常分类:API查找Throwable 1.Error(服务器宕机,数据库崩溃等) 2.Exception C(异常的继承体系)API查RuntimeException 运行时异常:一般是程序员的错误异常可以让我们发现错…

算法力扣刷题记录 三十七【二叉树层序遍历】

前言 二叉树递归遍历和二叉树迭代遍历 实现的前中后序遍历都归类深度搜索; 广度搜索如何实现?一层结束,再继续下一层搜索:层序遍历。 一、题目阅读 【102.二叉树的层序遍历】 给你二叉树的根节点 root ,返回其节点值…

如何在iPhone上恢复图片?5 个有效解决方案

对于许多iPhone用户来说,照片是存储在他们设备上的最重要的数据,因此丢失这些照片可能是一场灾难。 但是,即使您不小心删除了iPhone上的部分或全部图片,也可以将其取回。 我们将讨论如何在有或没有备份的情况下在iPhone上恢复已…

面试篇-Mysql-2+事务隔离级别的实现

文章目录 前言一、Mysql 的事务你了解吗二、你了解Mysql 的事务隔离级别吗:2.1 你知道Mysql 的脏读,不可重复读,幻读的问题吗:2.1.1 脏读:2.1.2 不可重复读:2.1.3 幻读: 2.2 对于并发场景下的脏…

Python使用策略模式和openpyxl库创建Excel文件并追加内容

from openpyxl import load_workbook# 数据数组 data [[1, 2, 3],[4, 5, 6],[7, 8, 9] ]# 打开现有的 Excel 文件 excel_file sheetApend_example.xlsx wb load_workbook(excel_file)# 选择要追加数据的工作表 sheet_name test_Sheet2 # 指定要追加数据的工作表名称 sheet…

AI Agent满级进化!骑马种田、办公修图,样样精通,昆仑万维等发布通用Agent新框架

【导读】智能体又双叒叕进化了!这次,什么游戏都能玩,什么软件都能操控了。 近日,昆仑万维携手北京智源人工智能研究院、新加坡南洋理工大学、北京大学等顶尖名校机构,联合提出了迄今为止第一个既能玩多种商业游戏又能…

Excel的Index+MATCH组合使用方法

INDEX函数 INDEX函数作用:用于从指定的单元格区域中返回特定行和列的值。 参数形式为:INDEX(array, row_num, [column_num]) array:必需。单元格区域或数组常量。 row_num:必需。要返回的值所在的行号。 [column_num]&#x…

【算法】【二分法】二分法详解

先给y总打一个广告。(我这种废物收不到钱) 本科时候就在打蓝桥杯玩玩算法,当时听朋友的一个刷题且涵盖教程的网站,ACWING。 www.acwing.com 里面好处是大部分基础算法都有,Y总的视频! y总我的神&#xff01…

LLMs 入门实战系列

【LLMs 入门实战系列】 第一层 LLMs to Natural Language Processing (NLP) 第一重 ChatGLM-6B 【ChatGLM-6B入门-一】清华大学开源中文版ChatGLM-6B模型学习与实战 介绍:ChatGLM-6B 环境配置 和 部署 【ChatGLM-6B入门-二】清华大学开源中文版ChatGLM-6B模型微调…

Rust入门实战 编写Minecraft启动器#5启动游戏

首发于Enaium的个人博客 好了,我们已经完成了所有的准备工作,现在我们可以开始编写启动游戏的代码了。 首先我们需要添加几个依赖。 model { path "../model" } parse { path "../parse" } download { path "../downlo…

ensp防火墙综合实验作业+实验报告

实验目的要求及拓扑图: 我的拓扑: 更改防火墙和交换机: [USG6000V1-GigabitEthernet0/0/0]ip address 192.168.110.5 24 [USG6000V1-GigabitEthernet0/0/0]service-manage all permit [Huawei]vlan batch 10 20 [Huawei]int g0/0/2 [Huawei-…

git常用命令及git分支

git常用命令及git分支 git常用命令设置用户签名初始化本地库查看本地库状态将文件添加到暂存区提交到本地库查看历史记录版本穿梭 git分支什么是分支分支的好处分支的操作查看分支创建分支切换分支合并分支合并冲突 git常用命令 设置用户签名 //设置用户签名 git config --gl…

Datawhale 2024 年 AI 夏令营第二期——基于术语词典干预的机器翻译挑战赛

#AI夏令营 #Datawhale #夏令营 1.赛事简介 目前神经机器翻译技术已经取得了很大的突破,但在特定领域或行业中,由于机器翻译难以保证术语的一致性,导致翻译效果还不够理想。对于术语名词、人名地名等机器翻译不准确的结果,可以通…