博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 代码优化 【持续更新】
阅读量:2491 次
发布时间:2019-05-11

本文共 4113 字,大约阅读时间需要 13 分钟。

写在前面

对于C/C++程序提出代码优化方案、其它语言从该文中,应该也可以获得一定的优化思路。
文章内容由个人经验以及平时于网络所学习到的内容作为基础。
此处优化不做细节介绍,细节介绍及原因,可以查看后续推出的相关文章。
在成长的过程中,走了很多的坑,我不知道现在的认知是否有误,本文如有偏颇,不吝赐教,万分感激,哪里没有写到的也可以希望得到大神的指点。

优化方案

相关文章:

算法加速

1、位运算

尽可能的使用位运算来代替常规的乘法、除法、除余运算。
优先级: 位运算 -> 自增减运算 -> 加减法运算 -> 乘法运算 -> 除法运算 -> 除余运算 
例如:
s = b / 4; 可以替换为 s = b >> 2;
s = b % 4; 可以替换为 s = b & 3;
s = b * 3; 可以替换为 s = b << 1 + b;
s = b / l / w / h; 可以替换为 s = b / (l * w * h);
s = s + b; 可以代替位 s += b;
s = s * b; 可以代替位 s *= b;
s = s / b; 可以代替位 s /= b;
注:不要妨碍代码的理解

2、命令宏

我们平时都有用到宏,作为入参来确定某一个键值
#define WM_USERID 0x0001int main(void) {    int code = WM_USERID;    switch(code) {    case WM_USERID:        break;    case ...        break;    }    return 0;}// 手敲 未测试正确性
这个时候,宏在可预料范围内,并且数量相对较少时,尽可能使用2的指数次作为定义规则。
例如:1、2、4、8、16(0x10)、32(0x20) 等

3、++前 && 后++

尽量使用 ++前  代替 后++
_SingleList::Iterator& _SingleList::Iterator::operator++()//前加{  pNote = pNote->pNext;  return *this;}_SingleList::Iterator _SingleList::Iterator::operator++(int)//后加{  Iterator tmp(*this);  pNote = pNote->pNext;  return tmp;}
注:使用前,请务必充分理解 ++前 后++ 的意义

4、泛型编程

利用模板进行泛型编程能够很好的提高代码的效率以及整洁程度。

5、二叉树

最佳使用

1、数据类型

能用bool类型的不用char类型,能用char类型的不用short, 能用short的不用int,能用int的不用long
在程序运算中,显而易见的变量范围,应当最小化。
虽然在某些情况下不见得会增加很大的效率。
例如:
人的年龄:
unsigned char
年份:
short
图像像素值:
unsigned char
性别:
bool

2、内联函数

简单的get set 语句直接写在头文件当中
一些函数明显短且经常会被调用的 可以内联 inline
内联函数不得出现for等循环语句
详细介绍可以网上查,烂大街啦。

3、最小冗余

有些明显使用频繁,且其具有通用性的代码段应该封装成一个函数体,将其中可变且需要外部指定的数值,作为函数体的参数。
减少代码段的重复量。让代码主线思路整洁清晰。

4、形参引用

调用函数传参的时候,使用引用传参,可以减少不必要的临时对象生成,减少内存消耗,一般用于类类型传参使用。
void func(std::string& _src) {    _src = "CSDN";    return;}int main(void) {    std::string src("Ayo");    func(src);    std::cout << src.c_str() << std::endl;    return 1;}

5、使用常量形参

如果对形参没有修改,尽可能添加const,以做到兼容更多的参数
void const_func(const char * _src) {    return;}int main(void) {    std::string src("Ayo");    const_func(src.c_str());    std::cout << src.c_str() << std::endl;    return 1;}
反例
void func(char * _src) {    return;}int main(void) {    std::string src("Ayo");    func(src.c_str()); // error    std::cout << src.c_str() << std::endl;    return 1;}

------------------ADD BEGIN----------------

2016/11/24 关于const的细节说明

为什么要使用const?

我们尽最大可能的使用 const 是为了告诉程序这个值是不能被改变的,在后期的调试过程中,我们也可以从参数类型中确认当前参数没有可能被改动。对于调试带来了很大的遍历。

上面有提到形参尽可能使用引用,想必各位都知道改引用就是在改被引用的值,我们为形参添上限定符const以后,就可以确保当前参数的安全性,也能告诉外部调用者,当前函数并没有对参数进行更改,只是单纯了使用了一种优化技术。

我们来看下上面的反例,这个反例很显然的说明了一个问题,利用const限定符,可以更有效的接收更多类型的参数。这样也有助于我们调用者的使用。

-------------------ADD END------------------

6、参数最小生命空间

用的时候再声明,减少不必要的开销。

void function(int _doWhat) {    std::cout << _doWhat << std::endl;    return;}int main(void) {    std::string str("123");    // 一个很少会触发的if语句    if (i < 0) {            std::stringstream io;        int num;        io << str;        io >> num;        function(num);        // str do something..    }    return 0;}

反例

void function(int _doWhat) {    std::cout << _doWhat << std::endl;    return;}int main(void) {    std::string str("123");    std::stringstream io;    int num;    // 一个很少会触发的if语句    if (i < 0) {        io << str;        io >> num;        function(num);        // str do something..    }    return 0;}

7、初始化

尽可能使用构造初始化,避免使用赋值初始化

std::string str("123"); // good code std::string str = "123";

------------------ADD BEGIN----------------

2016/11/20相关文章:

-------------------ADD END------------------

8、if 语句

断点调试过的朋友都应该知道,if 是每一个分支语句都去做一次判断的。这也影响了代码的运行效率

如果条件允许的话,使用switch代替if语句。

9、循环前声明参数

// 正例ClassPerson str;for (int i = 12; i < 32; ++i) {    str.idcard = i;    // do something}// 反例for (int i = 12; i < 32; ++i) {    ClassPerson str;    str.idcard = i;    // do something}

------------------ADD BEGIN----------------

2016/11/24相关优化

10、变量的声明顺序

struct {    bool flag;    bool state;    char name;    int   age;    double sss;}

应从最小的类型开始声明,在某一些编译器里,可以有效的减少内存的占用。

因为有些编译器使用的是4字节对齐,以便分界。细节可以自行查询。

-------------------ADD END------------------

最大利用

1、现有算法

在学术界有很多公认非常优良的算法,可以根据自己情况选择使用。

例如:

查找:二分查找、分块查找、哈希查找

排序:快速排序、堆排序、归并排序

2、现有库

数据存储:Sqlite3、Mysql等

图像处理:opencv、matlab

结后语

1、可理解

代码的优化,一定要考虑到可理解性!!!  不要自己天花乱坠,画蛇添足。

2、优化方向

个人认为:

要从最常用的代码块开始优化,因为要把好路建在最有用的地方,不要在深山里建造昂贵的高架。

先保证逻辑简单清晰,再来考虑算法优化,和上文写的最佳使用

转载地址:http://foqrb.baihongyu.com/

你可能感兴趣的文章
vnpy通过jqdatasdk初始化实时数据及历史数据下载
查看>>
设计模式19_状态
查看>>
设计模式20_观察者
查看>>
vnpy学习10_常见坑02
查看>>
用时三个月,终于把所有的Python库全部整理了!拿去别客气!
查看>>
pd.stats.ols.MovingOLS以及替代
查看>>
vnpy学习11_增加测试评估指标
查看>>
资金流入流出计算方法
查看>>
海龟交易法则07_如何衡量风险
查看>>
海龟交易法则08_风险与资金管理
查看>>
海龟交易法则09_海龟式积木
查看>>
海龟交易法则10_通用积木
查看>>
海龟交易法则14_掌控心魔
查看>>
海龟交易法则16_附原版海龟交易法则
查看>>
克罗谈投资策略01_期货交易中的墨菲法则
查看>>
克罗谈投资策略02_赢家和输家
查看>>
克罗谈投资策略03_你所期望的赌博方式
查看>>
克罗谈投资策略04_感觉与现实
查看>>
通向财务自由之路01_导读
查看>>
通向财务自由之路02_成功的决定因素:你
查看>>