一、表达式优化--使用替换程序中的乘除法

c/c++中的加减运算效率远远高于乘除运算,由于移位指令的执行速度和乘除法差不多,所以可以使用移位的方式来替换程序中的乘除法。一个数向右移一位,等于该数乘以2;向左移一位,等于该数除以2;通过这种移位的方式可以明显提高程序的工作效率;

理论上讲,所有的乘法运算均可以转化为移位操作,如a*8,可以替换为:a<<3;a*13,可以替换为:a<<3+a<<2+a;

但对于除法,只有a为2的n次幂时,才可以进项替换,如a/8,可以替换为a>>3;而a/13就无法进行替换;

二、表达式优化--常量折叠

通常程序运行过程中需要进行连续的四则运算,如

int a=;
a=a+*+;

这个时候程序需要进行两次加法和一次乘法运算,而使用如下方式:

int a;
a=a+;

只需进行一次加法运算,此时的效率相比上面的运算就快了许多。通常把程序中的常量人为计算的方法叫做常量折叠

*这是一种常规优化,很多编译器会自动完成,在日常编写过程中,不使用常量折叠可能更便于理解,需要自行斟酌

三、表达式优化--使用数学公式

通常数学公式都是为了简便运算而推导出来的,所以在计算机中也是一样。比如等差数列求和的运算,如果使用循环进行累加需要进行的步骤远比使用公式进行计算多,相应的效率也一定比使用公式低。

四、表达式优化--存储问题

变量的保存需要保存在内存中,而CPU对内存的访问相比对内部寄存器的访问是很耗时的,

如x=x+1;这样的语句,程序默认右边会有两个以上操作数,尽管操作的变量是同一个,但全部过程对x的寻址操作依然有两次,还有一次加法。

而使用x+=1;这样的语句,程序默认右边的操作数只有一个,只对变量寻址一次,计算加法存入x,相比上面的等式效率就会有所提高;

五、分支优化--改变判断顺序

这一天在if-else语句中尤为明显,举个例子,编写一个程序统计一篇英文文章中的字母、数字、空格个数。

文章中肯定是字母数>空格数>数字数,

如果先判断是不是数字,再判断是不是空格,再判断是不是字母,那么统计过程中大部分位置要统计至少三次

如果换个判断顺序,先判断是不是字母,再判断是不是空格,再判断是不是数字,那么大部分位置仅仅只需要统计一次,这样的处理效率就比上面的效率要高出很多

六、分支优化--使用switch语句

从反汇编代码中可以看出,switch语句只需要比较一次即可跳转;而if-else则需要对每个跳转语句进行一次比较,所以,在多个同等级的比较分支结构中,尽可能使用switch语句编写的程序会比同功能的if-else语句执行起来效率要高

七、循环优化--一次性计算

循环结构中,多次不进行改变或运算的语句成为一次性计算,比较下面两个程序:

先看下面这个程序:

int len;
int a[];
for(i=;i<;i++)
{
len=;
a[i]+=len;
}

这个程序中,每一次循环都需要对len重新赋值为1,非常耗时,效率并不高;

再看下面这个程序:

int len=;
int a[];
for(i=;i<;i++)
{
a[i]+=len;
}

每次循环只需进行一次加法,效率就比上面的程序高出许多

八、结构体优化

现在很多操作系统为了能高效的使用cpu,使用了对齐机制,每次都保证cpu读取同样长度的内容,以提高运行速度。这种对齐机制是一种典型的用空间换时间的做法。

一些32位系统普遍使用了4字节对齐方式,对不足位用无用值(通常为0)填补。

如果定义如下结构体:

struct  test
{
char ch;int i;
  short s;
}

char类型占用一字节,short类型占用两个字节,int型占用四个字节,按照上面定义,char型占用了一个字节,而紧接着int型刚好占用4个字节,为了保证int型的完整连续,会默认把char的一个字节扩充为四字节,后面的short型也不足四字节,又要扩充为四字节,所以当对上面的结构体求长度时:

sizeof(test)会等于12;

但如果使用如下定义方式:
struct test
{
char ch;
short s;
int i;
}

char和short型优先占用前三个字节,为了保证int型的完整连续,会对char和short共同占用的不足四字节的空间进行填补,那么就会只增加一个字节,所以当对上面的结构体求长度时:

sizeof(test)会等于8;

用这种良好的编程习惯,会既保证程序运行效率又最大限度的保证了合理的运用存储空间。

c/c++优化结构控制的更多相关文章

  1. hive优化之——控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...

  2. PL\SQL结构控制、异常

    PL\SQL结构控制    1.IF条件控制语句(三种基本方式+IF语句的嵌套使用)        (1)IF...        (2)IF...ELSE        (3)IF...ELSIF. ...

  3. mysq'l系列之10.mysql优化&权限控制

    网站打开慢如何排查 1.打开网页, 用谷歌浏览器F12, 查看network: 哪个加载时间长就优化哪个 2.如果是数据库问题 2.1 查看大体情况 # top # uptime  //load av ...

  4. 【转】hive优化之--控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数:  1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置 ...

  5. hive优化之------控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的 ...

  6. go 语言结构控制

    if  else 结构: #第一种 if condition { // do something } #第二种 if condition { // do something } else { // d ...

  7. hive优化,控制map、reduce数量

    一.调整hive作业中的map数 1.通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为1 ...

  8. IT兄弟连 Java语法教程 流程控制语句 控制循环结构3

    使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循 ...

  9. IT兄弟连 Java语法教程 流程控制语句 控制循环结构2

    使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循 ...

随机推荐

  1. NB-IoT的相关资料整理(基本概念,技术优势,典型案例和当前的进展)

            人与人之间的通讯规模已近天花板,物与物的则刚刚进入增长快车道.随着可穿戴.车联网.智能抄表等新兴市场的开启,工业4.0.智慧城市.智慧农业等理念照进现实,万物互联的时代正加速到来. 一 ...

  2. Android开发自学笔记(Android Studio)—4.3ImageView及其子类

    一.引言 ImageView继承自View组件,主要功能用来显示图片,实际上他能显示的不仅是图片,Drawable对象都可以用ImageView来显示. ImageView派生了ImageButton ...

  3. php中关于引用(&)详解

    php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...

  4. ubuntu下配置vpn

    Ubuntu系统下搭建VPN环境 以下是基于Amazon EC2/Ubuntu搭建PPTPD服务提供VPN连接的过程记录.至于为什么要搞VPN,大家都懂的...而我主要是要访问Python的一些网站以 ...

  5. nginx 报错 HTTP ERROR 500 (PHP数组简写模式)

    同样的代码放在Apache上执行可以执行,在nginx上面就报错了. 百度出来一堆结果貌似都不对,然后只有注释代码->运行程序,一步步找到问题所在 $buffer = []; 这一步报错了 原来 ...

  6. Android Studio NDK初探

    Android Studio中实现NDK开发较之前Eclipse+Cygwin,方便了很多. 本文以最简单的从C程序中获取字符串,并显示到MainActivity的TextView上为例进行NDK开发 ...

  7. 100_1小记ressons analysis

    想到一首诗用以自勉: look to the master, follow the master, walk with the master, see through the master, beco ...

  8. 通用PE工具箱 4.0精简优化版

    通用PE工具箱 4.0精简优化版 经用过不少 WinPE 系统,都不是很满意,普遍存在篡改主页.添加广告链接至收藏夹.未经允许安装推广软件等流氓行为,还集成了诸多不常用的工具,令人头疼不已.那么今天给 ...

  9. 线程GCD

    #import "ViewController.h" @interfaceViewController () @end @implementation ViewController ...

  10. apache启动出错原因举例

    这是我这两天频繁遇到的问题.Apache服务器还真是问题少年!任何点改动都可能导致它无法使用. 原因一:80端口占用例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软 ...