goto问题

这两天帮着review一段代码,正好看到下面的一个函数,

看过觉得这段代码中出现一个很熟悉的关键字 goto,学c语言都应该有被无数次的教导过不要用goto的经历。到底为什么不建议用goto语句呢,当时也没有仔细研究,现在想来应该有以下几个原因:

可读性差

可维护性差

上面已经说了不容易看懂,既然不容易看懂就更谈不上改了。代码里跳转太多,在里面添加任何逻辑都有可能导致程序会无法完成正常运转。goto需要的跳转标签需要在行首,在不规范的代码很容易淹没在正常逻辑中,容易在标签的命名上产生重复。

流程可控性差

性能损失

goto是由硬件汇编衍生过来的,对应汇编的jump或者long jump。但是在过去时间里面cpu的主频比较低,但是还是会有基本的流水线结构,一般执行当前指令时,会预取两条指令存储在寄存器中。但是goto回直接让cpu进行跳转,这样的结果就是预取的指令用不上了,然后需要重新预取指令进行执行。早一些的cpu的跳转能力还很差,多次的跳转会让cpu性能损失比较严重。

是不是goto就一无是处呢h1>

当然不是!对应linux kernel中代码看一下AT32AP700x的rtc代码

从中我们可以总结goto的几个可以使用的情况:

一个函数中多次执行程序片段

可以看到上面的程序中对于初始化失败后需要执行错误处理,有几个地方出错处理是一样,但是又不想把出错处理包装成函数,把出错处理程序在每个需要的地方复制粘贴又太傻,goto这时候就很有价值。

可以当程序中注释

多层循环的跳出

程序如果存在多层的循环,在循环中如果想要退出的话可能需要多个的break才能实现跳出,但是goto却是一个很简化的方法。

goto 需要注意什么

写程序跟 会上的其他事情都一样,专家大神讲的都被奉为圣旨,严格遵守少数人订立的规则,却每天都在见到乱拳打死老师傅的情景。所以也就随着自己认为的原则就好了。对一般水平的大众来说goto可以用但是最好注意以下几条:

  • 不要大量使用

  • 不要向前跳

  • 注意堆栈

最后

goto使用的讨论一直持续,各路大神小妖都有自己的一套理由和结论。听说还有人专门写了论文来研究,个人觉的还是使用多了根据自己的情况来决定是否使用和怎么使用吧。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年7月3日
下一篇 2016年7月3日

相关推荐