程序性能有两个考核指标,一是时间,二是空间,本文是针对空间上进行优化,尽可能减少程序的运行内存(可能会增加运行时间)。

栈内存优化

由于栈是操作系统进行管理的,因此不需要主动去释放内存,不要申请过大的栈内存,防止栈溢出。

a,函数不能太大(建议不超过40~50行),否则会导致线程占据的栈内存过多。
b,内存值较大的函数参数尽可能使用引用或者指针。
c,函数体内定义变量和使用变量地方尽可能紧凑,操作系统器会早点回收栈内存,减少栈内存的使用量。

堆内存优化

内存计算

一般是调用操作系统提供的内存消耗接口,周期性输出内存消耗数据,并且制作成曲线图,便可以清晰看出内存消耗情况。注意此时不要运行其他程序,以免造成干扰。

内存优化

编译器优化
a,嵌入式的话,可以指定CPU型号,进行特定的编译。
b,开启-O优化选项。

算法和数据结构优化
a,如果是确定的数据长度,主要做查询工作,建议使用数组来完成。
b,如果是插入删除次数为主,需要使用链表或者哈希表。
c,使用高效的排序和查找算法。
d,结构体里面数据成员按照CPU位长对齐。

函数优化
a,小函数使用内联函数
b,减少函数的入参个数,尽可能使用引用传递或者移动语义

底层库或者API优化
a,使用内存消耗较小的库或者API。 Mebdtls
b,减少库文件的引入,比如求绝对值可以自己定义宏函数。
c,删除printf多策略函数,使用puts更好


a,设计类的时候,继承层数不要过多
b,定义移动构造函数和移动赋值运算符,避免不必要的复制操作

运算
a,除以2或者2的幂的除法运算改用右移;
b,使用复合赋值运算符代替普通运算符,比如 a += b; a = a + b;
c,浮点运算转换成整数运算,尽量少用浮点运算
d,简化表达式:y = a*x*x*x + b*x*x + c*x + d; => y = (((a*x + b)*x) + c)*x + d;
e,Switch代替if-else

For循环
a,不变的代码(strlen)移出循环体外
b,展开循环,读的话按照1:8,写的话按照1:16,当然根据具体的处理器来进行调试。
c,for中慎用涉及构造析构的语句,建议放在for之外。比如string、vector
d,避免在循环中动态地创建变量
e,避免在循环中调用隐藏的函数
(1)• 声明一个类实例(调用构造函数)
(2)• 初始化一个类实例(调用构造函数)
(3)• 赋值给一个类实例(调用赋值运算符)
(4)• 涉及类实例的计算表达式(调用运算符成员函数)
(5)• 退出作用域(调用在作用域中声明的类实例的析构函数)
(6)• 函数参数(每个参数表达式都会被复制构造到它的形参中)
(7)• 函数返回一个类的实例 (调用复制构造函数,可能是两次)
f,for中建议使用移动赋值而不是拷贝赋值运算符

【C++】【内存】系列三:内存优化相关推荐

  1. 内存系列三:内存初始化浅析

    本篇承接上两篇文章,继续介绍DDR内存在固件中如何初始化,以及如何提高初始化的效率等等. 小张上次回去后,好久都没来找我,我以为他对内存知识已经不感兴趣了,没想到他今天又约我见面.我来到上次的咖啡馆, ...

  2. 深入Golang内存管理(三) 内存对齐篇

    Go struct 内存对齐 举个例子 type S struct {a boolb int32c int8d int64e byte } 上面的struct S,占用多大的内存? 首先我们按照每个成 ...

  3. 端游《原神3.2》任务真端1.2 超级8G小内存 第三版优化完善单机版

    特别说明:VM单机版服务端解压后有近50GB,客户端3.2国服也有40多GB,请确保你电脑硬盘有足够的空间,推荐是固态硬盘,否则解压,运行游戏都会非常非常慢,同时需要特别注意你的C盘空间是否够大,ra ...

  4. WIN7封装教程2018系列(三)—手动优化与清理

    在保证系统稳定,长效的前提下对系统进行适当的优化清理是有必要的.其实大部分优化清理都可以通过优化工具软件来完成操作,不过工具也不是万能的,不能保证优化和清理百分之百的内容,至少目前没有这样的工具,所以 ...

  5. 查看linux内存优化,Linux性能优化和监控系列(三) 分析Memory使用状况

    Linux性能优化和监控系列(三) 分析Mem 分析Memory使用状况 内存是影响服务器性能的一个主要因素, 当进程已经驻留内存或者系能够分配给进程足够的内存给它, CPU能顺利自如的运行. 如果发 ...

  6. linux内存的active,Linux性能优化和监控系列(三)——分析Memory使用状况

    分析Memory使用状况 内存是影响服务器性能的一个主要因素, 当进程已经驻留内存或者系能够分配给进程足够的内存给它, CPU能顺利自如的运行. 如果发生内存不足, 服务器使用I/O channel获 ...

  7. Android性能优化系列之内存优化

    在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存,但也随之带来了内存泄漏的可能,上篇博客,我介 ...

  8. 「数据库系列三」磁盘、内存和带宽

    聊聊影响流量的三大物质因素:磁盘.带宽.内存 速度上内存 >带宽(带宽可以看作网络的吞吐量)>磁盘 google 工程师Jeff Dean 首先在他关于分布式系统的ppt文档列出来的,到处 ...

  9. JVM优化系列-JVM内存溢出的原因

    导语   内存溢出(OutOfMemory)OOM,通常情况下出现在某一块内存空间快要消耗完的时候.在Java程序中,导致内存溢出的原因有很多,下面就来分享关于内存溢出的一些问题.其中包括堆内存.直接 ...

  10. linux 优化内存分配,Linux性能优化 第三章 性能工具:系统内存

    3.1内存性能统计信息 3.1.1内存子系统和性能 和CPU相比,内存的读写速度都大大落后于CPU.为了弥补这个差距,通常CPU会采用高速缓存的机制(高cache). 3.1.2内存子系统(虚拟存储器 ...

最新文章

  1. UNIX再学习 -- 函数 fork 和 vfork
  2. 2018年12月7日 字符串格式化2 format与函数1
  3. 原生JS字符串操作方法汇总
  4. android包结构规范,【Android】Android产品-开发规范
  5. 【Openstack】实录手动部署Openstack Rocky 双节点(2)- Keystone
  6. pytorch将Tensor转为list
  7. HDU 5972 Regular Number
  8. 剑指offer面试题[32]:从1到n整数中1出现的次数
  9. java jmx教程_【JAVA】JMX简单使用方法
  10. macbook pro忘记开机密码怎么办
  11. 腹有诗书气自华——记环宇通软CEO骆永华 1
  12. diy 扫地机器人 滚刷_扫地机及其滚刷的制作方法
  13. Bzoj4763 雪辉
  14. 消费者洞察案例分析_情绪搜索洞察定时器案例研究
  15. 长安链ChainMaker基于公钥用户标识的身份模式介绍
  16. html5绘制随机五角星_HTML5 canvas基本绘图之绘制五角星
  17. 邮箱验证(验证码验证)
  18. 学生管理系统登入页面
  19. Lighting - 光的亮度衰减
  20. Naive Deco Sans手写不规则线条字体 for mac

热门文章

  1. 计算机怎么发音乐,有哪些方法可以把歌曲发送到远方的朋友的手机上?
  2. Google Play的APK下载(APK Downloader)解决方案
  3. Freertos消息队列接收源码xQueueGenericReceive分析
  4. CodeForces1036 F Relatively Prime Powers(莫比乌斯容斥)
  5. [JS]Tue Feb 01 2022 00:00:00 GMT+0800 (中国标准时间) 日期格式化
  6. IDEA 如何新建Source Folder
  7. OutMan——Foundation框架中的常用结构体、NSNumber类和NSValue类
  8. linux如何禁用独立显卡驱动,Ubuntu中独立显卡不好用如何关闭独立显卡
  9. Photoshop透明度网格颜色设置方法
  10. 『杭电1206』劲乐团