c++ - 这种替代的 'for' 循环语法有什么依据吗?

标签 c++ for-loop

我遇到了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循环使用之前的第二种形式,所以声称它是“新的热度”让我感兴趣。我可以看到一些理由:

  1. 使用构造函数直接初始化与复制初始化
  2. !=在硬件上可能比 < 更快
  3. ++i不要求编译器保留 i 的旧值周围,​​这是i++会的。

不过,我认为这是过早的优化,因为现代优化编译器会将两者编译成相同的指令;如果有的话,后者更糟,因为它不是“正常的”for环形。使用 !=而不是 <我也很怀疑,因为它使循环在语义上与原始版本不同,并且可能导致一些罕见但有趣的错误。

for 的“新热度”版本有什么地方吗?循环很流行?这些天(2016+)是否有任何理由使用该版本,例如不寻常的循环变量类型?

最佳答案

  1. Direct initialization using a constructor vs copy initialization

    这些与 int 完全相同s 并将生成相同的代码。使用您喜欢阅读的任何一个或您的代码策略是什么等。

  2. != could be faster in hardware than <

    生成的代码实际上不会是 i < ni != n ,就像 i - n < 0i - n == 0 .也就是说,你会得到一个 jle在第一种情况下和 je在第二种情况下。所有jcc指令具有相同的性能(参见 instruction set referenceoptionization reference ,它们只是将所有 jcc 指令一起列出为吞吐量为 0.5)。

    哪个更好?对于int s,在性能方面可能并不重要。

    做起来更安全<如果您想跳过中间的元素,那么您不必担心最终会出现无限/未定义的循环。但是,只需编写对您正在编写的循环最有意义的条件即可。也看看dasblinkenlight's answer .

  3. ++i doesn't require the compiler to keep the old value of i around, which is what i++ would do.

    是的,那是胡说八道。如果您的编译器无法判断您不需要旧值,只需重写 i++++i ,然后得到一个新的编译器。那些肯定会编译成具有相同性能的相同代码。

    也就是说,使用正确的东西是一个很好的指导方针。你想增加 i ,所以这是 ++i .只有在需要使用后增量时才使用后增量。句号。


也就是说,真正的“新热点”肯定是:

for (int i : range(n)) { ... }

关于c++ - 这种替代的 'for' 循环语法有什么依据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39494473/

相关文章:

c++ - 引用计数在 shared_ptr 中不起作用

c++ - 尝试在注册表中创建值 - C++ - RegSetValueEx

python - 在python中制作组和列表

java - for 循环内的 Thymeleaf 帖子形式

c++ - 如何用QToolButton正确管理文本和图标?

c++ - 如何为字符数组制作模板函数特化?

python - ncurses 中的六角网格

javascript - Razor View 查找从 javascript 循环分配的 Id

筛选两列并提取数据的Excel VBA代码

iOS 检查注释的坐标是否为 {0,0}