我们知道++i和i++是有区别的
#include
using namespace std;
int main()
{
int a = 0;
int b = 0;
int c = ++a;
int d = b++;
cout << "c = " << c << endl;
cout << "d = " << d << endl;
return 0;
}
输出结果:
c=1
d=0
那么++i和i++哪个更高效呢?
如果前面的变量类型是c++自带的类型,执行效率是一样的(有兴趣可以用gdb查看汇编代码)
如果变量是我们自定的数据类型,++i效率高于i++
详细的您可以参考:
https://www.bbsmax.com/A/kjdwYg9EJN/
++i的效率高些,++i在运算过程中不产生临时对象,返回的就是i,是个左值,类似++i=1这样的表达式是合法的,而i++在运算的过程中会产生临时对象,返回的是零时对象的值,是个右值,像i++=1这样的表达式是非法的
对于内置类型,单独的i++和++i语句,现在的编译器基本上都会优化成++i,所以就没什么区别。
考虑内建数据类型时,它们的效率差别不大(去除编译器优化的影响)。所以在这种情况下我们大可不必关心。
现在让我们再考虑自定义数据类型(主要是指类)的情况。此时我们不需要再做很多汇编代码的分析了,因为前缀式(++i)可以返回对象的引用,而后缀式(i++)必须产生一个临时对象保存更改前对象的值并返回(实现过自定义类型++运算符定义的就知道),所以导致在大对象的时候产生了较大的复制开销,引起效率降低,因此处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能的使用前缀式地增/递减,因为他天生体质较佳。
内建数据类型的情况,效率没有区别。
自定义数据类型的情况,++i效率较高。
不管后自增tmp=i++还是前自增tmp=++i都是2个步骤:tmp=i++等同于:
tmp=i;
i=i+1;
前自增tmp=++i等同于:
i=i+1;
tmp=i;
由以上2个等同于的式子,你可以看出如果是求tmp,那在计算机内可能是i++更先一步,因为它是先赋值再自增。
如果是求i本身的结果,可能是++i更先一步,因为它是先自增,再赋值给tmp。
不过不建议这样比较,因为它们都是两步。
该回答引用ChatGPT
在 C++ 中,++i 和 i++ 的效率差异通常很小,如果存在差异,那么这种差异可以被编译器优化掉。因此,选择 ++i 还是 i++ 并不影响程序的效率。
更重要的是,选择 ++i 还是 i++ 更多是一个代码风格问题,它取决于程序员的习惯和编程风格。对于程序员而言,选择适合自己风格的方式并使用一致的风格是更重要的。
前置++
:
add DWORD PTR [rbp-4], 1
mov eax, DWORD PTR [rbp-4]
mov DWORD PTR [rbp-12], eax
后置++
:
mov eax, DWORD PTR [rbp-8]
lea edx, [rax+1]
mov DWORD PTR [rbp-8], edx
mov DWORD PTR [rbp-16], eax
可见,在你给出的这段代码中,前置++
指令更少。
但是,得到的结果不同,就无法比较所谓高效!
在前置和后置++
单独成句时,生成指令相同。