【问题标题】:Loop checking convention循环检查约定
【发布时间】:2017-03-11 00:53:42
【问题描述】:

如果我正在经历一个循环,比如迭代一个向量,并且我不想对向量中的某个项目执行操作,我可以通过两种方式进行操作:

这是我更喜欢使用的一个:

vector<int> vec;
void loopFunction(int toIgnore) {
    for (size_t index = 0; index < vec.size(); index++) {
        if (vec[index] == toIgnore) continue;
        // do stuff
    }
}

这是我看到大多数人使用的:

vector<int> vec;
void loopFunction(int toIgnore) {
    for (size_t index = 0; index < vec.size(); index++) {
        if (vec[index] != toIgnore) {
            // do stuff
        }
    }
}

我知道最终结果绝对没有区别。但是,由于第二种方式打开了一个新的执行范围,因此在幕后有什么区别吗?这两个中的任何一个比另一个更受欢迎吗?

谢谢

【问题讨论】:

  • 就我个人而言,我尽量避免嵌入范围,因此我可以使用continue 进行第一个示例,这样循环中的所有内容都处于同一级别。不过,一切都与偏好有关。据我所知,两者都没有性能优势
  • 我也更喜欢第一种方式。我也不喜欢代码中的嵌套范围。但是,添加新范围是否会增加开销?我认为它可能适用于大循环?

标签: c++ loops convention


【解决方案1】:

正如我的评论中所述,就个人而言,我更喜欢使用continue 的第一个实现,以防止不必要的代码嵌套和范围创建。

除了将要实现的正常代码之外,每个方法的唯一性能开销是对if-statement 中表达式的求值。由于它们都包含要评估的表达式,因此它们在性能方面是相同的。

如果您考虑一下它是如何编译的,对于 C/C++,它会直接编译成汇编代码。在该级别上,无论您如何嵌套代码,它都会编译成简单的jmpcmp 命令。因此,无论实现如何,在编译时,您都将拥有 ~ 相同的汇编代码。

无论你怎么看,这都是一个微优化,如果有的话!做你喜欢的代码格式和样式。

【讨论】:

  • 感谢您的澄清。然后我会坚持第一种格式,看起来更整洁:p
  • 我对巨大的向量进行了性能测试,是的,它们产生了相似的结果。此外,我在 C# 上进行了测试并得到了相同的结果,所以它们真的没有区别。只是偏好
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多