前缀自增++i比后缀i++更高效,尤其对迭代器等非内置类型,因后者需构造临时对象;内置类型如int经编译器优化后二者无差异,但统一用++i可避免隐患。

因为 ++i 是前缀自增,直接修改并返回自身;而 i++ 是后缀自增,需先保存原值再修改,多一次拷贝开销——尤其对迭代器这类非内置类型,这个差异更明显。
内置类型(如 int)其实没差别
现代编译器对 int i; 这类简单类型通常会优化掉后缀自增的临时对象,生成的汇编代码和前缀几乎一致。所以别为 int 过度纠结,但养成写 ++i 的习惯有助于统一风格、避免后续隐患。
迭代器才是性能关键场景
STL 迭代器(比如 std::vector::iterator、std::map::iterator)通常是类对象,后缀自增 i++ 必须:
- 构造一个临时迭代器副本(调用拷贝构造函数)
- 再对原迭代器执行自增操作(调用
operator++()) - 最后返回那个副本
而 ++i 只需调用 operator++() 并返回引用,无拷贝、无临时对象。
立即学习“C++免费学习笔记(深入)”;
循环中务必用 ++i
常见 for 循环里,如果只关心“推进迭代器”,不使用返回值,用 i++ 就是纯浪费:
// ❌ 不推荐:i++ 在每次迭代都多一次拷贝
for (auto i = vec.begin(); i != vec.end(); i++) { ... }
// ✅ 推荐:++i 语义清晰且无额外开销
for (auto i = vec.begin(); i != vec.end(); ++i) { ... }
重载时要体现语义差异
如果你自己写迭代器或可自增类型,务必按标准方式实现:
-
T& operator++() { /* 修改自身 */ return *this; }(前缀) -
T operator++(int) { T tmp(*this); ++(*this); return tmp; }(后缀)
后缀版本显式构造临时对象,就是性能代价的来源——这也解释了为什么它天然比前缀慢。











