我遇到了a set of slides关于 C++ 的 rant 演讲。到处都有一些有趣的花絮,但幻灯片 8 让我印象深刻。它的内容大约是:
Ever-changing styles
Old and busted:
for (int i = 0; i < n; i++)
New hotness:
for (int i(0); i != n; ++i)
我从未见过 for
循环使用之前的第二种形式,所以声称它是“新的热度”让我感兴趣。我可以看到一些理由:
- 使用构造函数直接初始化与复制初始化
-
!=
在硬件上可能比<
更快 -
++i
不要求编译器保留i
的旧值周围,这是i++
会的。
不过,我认为这是过早的优化,因为现代优化编译器会将两者编译成相同的指令;如果有的话,后者更糟,因为它不是“正常的”for
环形。使用 !=
而不是 <
我也很怀疑,因为它使循环在语义上与原始版本不同,并且可能导致一些罕见但有趣的错误。
for
的“新热度”版本有什么地方吗?循环很流行?这些天(2016+)是否有任何理由使用该版本,例如不寻常的循环变量类型?
最佳答案
-
Direct initialization using a constructor vs copy initialization
这些与
int
完全相同s 并将生成相同的代码。使用您喜欢阅读的任何一个或您的代码策略是什么等。 -
!=
could be faster in hardware than<
生成的代码实际上不会是
i < n
与i != n
,就像i - n < 0
与i - n == 0
.也就是说,你会得到一个jle
在第一种情况下和je
在第二种情况下。所有jcc
指令具有相同的性能(参见 instruction set reference 和 optionization reference ,它们只是将所有jcc
指令一起列出为吞吐量为 0.5)。哪个更好?对于
int
s,在性能方面可能并不重要。做起来更安全
<
如果您想跳过中间的元素,那么您不必担心最终会出现无限/未定义的循环。但是,只需编写对您正在编写的循环最有意义的条件即可。也看看dasblinkenlight's answer . -
++i
doesn't require the compiler to keep the old value ofi
around, which is whati++
would do.是的,那是胡说八道。如果您的编译器无法判断您不需要旧值,只需重写
i++
至++i
,然后得到一个新的编译器。那些肯定会编译成具有相同性能的相同代码。也就是说,使用正确的东西是一个很好的指导方针。你想增加
i
,所以这是++i
.只有在需要使用后增量时才使用后增量。句号。
也就是说,真正的“新热点”肯定是:
for (int i : range(n)) { ... }
关于c++ - 这种替代的 'for' 循环语法有什么依据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39494473/