浅谈C语言 if else, switch, 条件运算符, 函数指针的选择问题

您所在的位置:网站首页 指针作为if条件 浅谈C语言 if else, switch, 条件运算符, 函数指针的选择问题

浅谈C语言 if else, switch, 条件运算符, 函数指针的选择问题

2024-06-14 07:54| 来源: 网络整理| 查看: 265

最近在写一个程序,其中有一个关键部分需要很多分支语句,由于这段代码需要被大量调用,所以效率问题自然成为了关键,在网上搜索了许多帖子,看到对这种情况的处理大概有 if else,switch,条件运算符以及函数指针四种方式。借助vs2015,查看了以下这这几种方式的反汇编,下面是对每种情况进行简单的分析:

假设我们有十种选择,分别是0,1,2,3,4,5,6,7,8,9。按照从前的思维方式,很自然会选择switch

switch(a)

{

case 0:

case 1:

...

}

通过反汇编代码可以看出,vs2015 debug模式对switch的处理方式是将a与第一个case的值开始比较,直到找到与a相同值的那个case,然后执行相关代码。如果我们不幸的将最常用的一个case放到最后一个,效率自然会比较悲剧……

另外一个常用的方式是if else

if(a == 0)

{}

else

{

    if(a == 1)

    {}

}.....

这种方式的原理和上述的switch是差不多的,如果我们将最常用的放到了最后一个if当中,效率是非常差的。

如果要选择上述两种方式进行选择,我认为可以根据不同情况进行考虑。如果有一个case会被经常用到,可以用switch,并且将这个case放在第一位,这样可以在很大程度上保持代码的整洁和清晰,同时还可以提高效率。如果每一种case被选择的概率大致相等,我建议采用if else进行二分查找,虽然很多编译器会采用跳表对switch进行优化,但这种方式太被动,将效率寄托于编译器确实不如自己动手优化来的稳妥。

另外一种常见的选择语句,或者说运算符,就是  (a > b ? a : b); 从前我非常喜欢用这种方式,特别是在查找最大值这种程序中,条件运算符又简单又清晰,然而反汇编告诉我,条件运算符的效率并不高于if else,因为在判断的过程中,计算机需要创建一个额外的临时变量用来存储“返回值”,每一次判断会比if else 多两条汇编,而且面对多重分支,条件运算符会让代码变得非常混乱,难以维护和理解。所以在这个地方我并不建议考虑采用条件运算符。但是在一些非高频调用的代码部分,采用条件运算符确实可以让程序变得清晰,简洁。

最后一种方式就是使用函数指针,即将几种case后面的代码分别打包为相同返回值,相同参数列表的函数,采用数组的方式对函数进行调用,这种方式免去了繁琐的cmp  ,而可以直接寻址调用,但是此时需要考虑的是函数压栈带来的一点点开销以及每一种case是否有相似的处理,再就是是否有简洁的方式将case变为连续或基本连续的无符号整型。如果可以方便的将每一种情况用数字表示,如0,1,2,3……这种情况,并且分支很多(越多其优势越明显),特别是每一种分支都不需要额外调用其他的函数时,采用函数指针将变为首选。

当然,谈论这些效率的前提是的确有必要将代码进行优化,如果一个分支语句只执行一次,几条汇编指令的差别在pc机上并不能给用户带明显的差异,这时我们需要做的,是让代码更清晰,容易维护。

鄙人入行it尚未满两年,如有不足,还望大神指正~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3