C++--流程控制语句
2015-05-08 14:36
369 查看
从底层谈流程控制语句
一般语句是从低地址到高地址(从上往下)顺序执行的,而流程控制语句则不是顺序执行而是通过 jxx 和 cmp (跳转和比较)指令实现的。而不同的流程控制语句之间效率的比较,我们主要是看它们跳转的次数多少,越少跳转,效率越高。不过这些,编译器一般会做优化,如把跳转次数多的控制语句转换成次数少的语句等。
if…else 与 switch语句的比较
if 语句条件判断对应的汇编跳转指令的条件是相反的,因为if是为真则不跳转,所以对应的汇编指令是为假则跳转。而switch的条件判断与汇编指令的条件判断是一致的。而且switch语句的执行效率要比if…elseif…这种语句要高,其具体原因:(1)首先是switch语句的跳转次数更少,它的底层汇编操作是把所有条件比较和所有具体执行语句分成两块写,这样只需先顺序比较,找到匹配,跳转到对应case语句体,只需1次跳转。而if形式的是将每条条件比较指令后紧跟对应语句体,即每比较一次就得跳转一次。(2)再者,对于switch语句编译器还做了优化,会生成对应地址表和索引表,可以不需要比较,直接匹配到对应的case语句体。
do,while,for比较
不谈编译器优化,它们的效率高低是:do > while > for,因为底层do语句只需跳转一次,while需要跳转两次,for则需要跳转3次。不过编译器一般会做优化,如会把while, for语句转换成do语句形式。
一般语句是从低地址到高地址(从上往下)顺序执行的,而流程控制语句则不是顺序执行而是通过 jxx 和 cmp (跳转和比较)指令实现的。而不同的流程控制语句之间效率的比较,我们主要是看它们跳转的次数多少,越少跳转,效率越高。不过这些,编译器一般会做优化,如把跳转次数多的控制语句转换成次数少的语句等。
if…else 与 switch语句的比较
if 语句条件判断对应的汇编跳转指令的条件是相反的,因为if是为真则不跳转,所以对应的汇编指令是为假则跳转。而switch的条件判断与汇编指令的条件判断是一致的。而且switch语句的执行效率要比if…elseif…这种语句要高,其具体原因:(1)首先是switch语句的跳转次数更少,它的底层汇编操作是把所有条件比较和所有具体执行语句分成两块写,这样只需先顺序比较,找到匹配,跳转到对应case语句体,只需1次跳转。而if形式的是将每条条件比较指令后紧跟对应语句体,即每比较一次就得跳转一次。(2)再者,对于switch语句编译器还做了优化,会生成对应地址表和索引表,可以不需要比较,直接匹配到对应的case语句体。
do,while,for比较
不谈编译器优化,它们的效率高低是:do > while > for,因为底层do语句只需跳转一次,while需要跳转两次,for则需要跳转3次。不过编译器一般会做优化,如会把while, for语句转换成do语句形式。
相关文章推荐
- C++程序员学Java系列之十一:流程控制语句switch,case,break,default
- 【C++学习笔记】08_流程控制语句
- [C++]C++的流程控制语句
- C++学习笔记 4th —— 万能流程控制if语句
- C++--流程控制语句
- C++学习笔记 5th —— 万能流程控制if语句 续篇:扩展与实际应用
- C++的流程控制语句
- C++程序员学Java系列之九:流程控制语句if,else
- C++流程控制语句
- C++流程控制中用于跳转的return和goto语句学习教程
- [C++]C++的流程控制语句
- 运算符_键盘录入_流程控制语句
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- SQL流程控制语句
- 流程控制语句
- js学习笔记 js添加元素,之前之后 流程控制语句
- 轻松学习JavaScript七:JavaScript的流程控制语句
- java之流程控制之if语句
- sql控制流程语句case when/if/ifnull/null if
- 3、shellwhile循环,C-for循环,until循环,case分支结构,流程控制语句