C 中的 i 和 i 之间有性能差异吗?

新手上路,请多包涵
阅读 422
2 个回答

[执行摘要:使用 ++i 如果您没有特定理由使用 i++ 。]

对于 C++,答案有点复杂。

如果 i 是简单类型(不是 C++ 类的实例), 那么 C 给出的答案(“不,没有性能差异”) 成立,因为编译器正在生成代码。

However, if i is an instance of a C++ class, then i++ and ++i are making calls to one of the operator++ functions.这是这些功能的标准对:

 Foo& Foo::operator++()   // called for ++i
{
    this->data += 1;
    return *this;
}

Foo Foo::operator++(int ignored_dummy_value)   // called for i++
{
    Foo tmp(*this);   // variable "tmp" cannot be optimized away by the compiler
    ++(*this);
    return tmp;
}

由于编译器不生成代码,而只是调用 operator++ 函数,因此无法优化 tmp 变量及其关联的复制构造函数。如果复制构造函数很昂贵,那么这可能会对性能产生重大影响。

原文由 Mark Harrison 发布,翻译遵循 CC BY-SA 3.0 许可协议

i++ 有时比 ++i 快!

对于使用 ILP(指令级并行)的 x86 架构,i++ 在某些情况下可能优于 ++i。

为什么?因为数据依赖。现代 CPU 并行化了很多东西。如果接下来的几个 CPU 周期对 i 的 递增 值没有任何直接依赖关系,则 CPU 可能会省略微码来延迟 i 的递增并将其推入“空闲槽”。这意味着您基本上获得了“免费”增量。

我不知道在这种情况下 ILE 会走多远,但我想如果迭代器变得太复杂并且指针取消引用这可能不起作用。

这是 Andrei Alexandrescu 的演讲,解释了这个概念: https ://www.youtube.com/watch?v=vrfYLlR8X8k&list=WL&index=5

原文由 glades 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题