我在写这篇博客之前也是被一些文章所误导,认为 ++i
的效率比 i++
的效率高,每次都是使用前置的 ++
。虽然操作没错,但是在认识上有错误,所以我把自己错误认识的经历分享出来,希望能够对和我有同样错误的人一些帮助。
一、内置数据类型
对于计算机内置的数据类型,现在的编译器水平比较高,比如 ++i
和 i++
没有任何的区别,我们可以通过查看汇编代码看出来。
- C语言源代码如下:
i++; // 后置的++ ++i; // 前置的++ i = i + 1;
- 汇编代码如下:
0x401366 addl $0x1,0xc(%esp) // i++; 0x40136b addl $0x1,0xc(%esp) // ++i; 0x401370 addl $0x1,0xc(%esp) // i = i + 1;
通过观察编译的结果,我们发现这三条语句的汇编代码没有任何的差异,但是我用的编译器是 Code::blocks,你也可以试用其他的编译器,比如Visual Studio Code 或者 VC++ 都可以,应该都是一样的。
二、自定义数据类型
对于自定义数据类型,前 ++
要高于后 ++
。简单的说,在 C++ 中 i++
在实现的时候会生产一个类对象,例如:
- i++ :
INT INT::operator++() { *this = *this + 1; return *this; }
- ++i :
INT INT::operator++() { INT val = *this; // 此时会产生一个类对象 *this = *this + 1; return val; }
如果有错误的地方也请各位朋友在评论区指出,我们互相学习。