在 C/C++ 中,i++ 和 ++i 的效率差异主要取决于使用场景:

核心结论:

  • 对于内置类型(如int):现代编译器优化后,两者效率基本相同
  • 对于自定义类型(如 C++ 迭代器):++i 通常比 i++ 更高效

详细分析

1. 内置类型情况

运行

// 内置类型int
int i = 0;
i++;  // 后置自增
++i;  // 前置自增

为什么效率相同?

  • 现代编译器会优化掉临时变量的创建
  • 两者最终生成的机器码几乎完全相同
  • 甚至在循环中:

    运行

    for (int i = 0; i < n; i++) { ... }
    for (int i = 0; i < n; ++i) { ... }
    
    经过优化后,这两种写法的性能没有差异

2. 自定义类型情况

cpp

运行

// C++迭代器示例
std::vector<int>::iterator it;
it++;  // 后置自增
++it;  // 前置自增

为什么++i更高效?

  • 前置自增++i:直接修改对象,返回引用

    cpp

    运行

    T& operator++() {
        // 修改自身
        return *this;
    }
    
  • 后置自增i++:需要先保存当前值,再修改,最后返回原值

    cpp

    运行

    T operator++(int) {
        T temp = *this;  // 多一次拷贝构造
        ++(*this);      // 调用前置版本
        return temp;    // 多一次返回拷贝
    }
    

性能差异:

  • 后置版本多了临时对象的创建和销毁
  • 对于复杂类型,这可能导致明显的性能开销

最佳实践

  1. 内置类型:使用i++++i均可,现代编译器会优化
  2. 自定义类型:优先使用++i以避免不必要的拷贝
  3. 统一风格:为了代码一致性,可以养成总是使用++i的习惯
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐