栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++】【内存】系列三:内存优化

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++】【内存】系列三:内存优化

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

栈内存优化

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

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中建议使用移动赋值而不是拷贝赋值运算符

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/665036.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号