以下面的(Obj-)C(++)代码段为例:
// don't blame me for the 2-space indents. It's insane to type 12 spaces.
int whatever(int *foo) {
for (int k = 0; k < bar; k++) { // I know it's a boring loop
do_something(k);
if (that(k))
break; // or return
do_more(k);
}
}
一位朋友告诉我,使用break
不仅更合乎逻辑(并且当有人想要事后向函数添加内容时使用return
会导致麻烦),但也会产生更快的代码。它表示处理器在这种情况下为jmp
- 指令提供了比ret
更好的预测。
或者当然我在第一点上同意他,但如果确实存在一些重大差异,为什么编译器不优化呢?
答案 0 :(得分:1)
如果键入2个空格是疯了,请使用带有自动缩进功能的体面文本编辑器。 4空格缩进 比2个空格更可读。
当您编写C代码时,可读性应该是一个基数值。
应根据上下文选择使用break
或return
,以使您的代码更易于理解和遵循。如果不是对别人,你会对自己有所帮助,几年之后你将会阅读自己的代码,寻找一个虚假的bug并试图理解它。
无论您选择哪个选项,编译器都会以自己的方式优化您的代码,不同的编译器,版本或配置将采用不同的方式。这种选择不会产生明显的差异,即使它不太可能出现,也不会持久。
专注于算法,数据结构,内存分配策略的选择,可能还有内存布局缓存的影响......这些对于速度和整体效率而言比本地微优化更为重要。
答案 1 :(得分:0)
任何编译器都能够优化跳转跳转。但实际上,在退出之前可能会有一些清理工作要做。如有疑问,请查看。我不知道这会如何产生任何重大影响。
在风格上,特别是在C语言中,当编译器超出范围时,编译器不会为我清理东西,我更喜欢单点返回,尽管我没有到{{1}一个。