(C++)i++和++i,哪个效率高一些

在看《程序员面试笔试宝典》时,发现了这样一个问题,书中只给出了++i的效率高一些,但并没有给出具体的解释和说明。

在网上找到下面的答案:

1、从高级层面上解释

++i 是i=i+1,表达式的值就是i本身

i++ 也是i=i+1,但表达式的值是加1前的副本,由于要先保存副本,因此效率低一些。

对于C++内置类型而言,大部分编译器会做优化,因此效率没什么区别。但在自定义类型上,就未必有优化,++i 效率会高一些。

2、从底层汇编来看内置类型

int a,i=0; a=++i;汇编代码如下:

int a,i=0;
01221A4E mov dword ptr [i],0
a=++i;
01221A55 mov eax,dword ptr [i]
01221A58 add eax,1
01221A5B mov dword ptr [i],eax
01221A5E mov ecx,dword ptr [i]
01221A61 mov dword ptr [a],ecx

int a,i=0; a=i++;汇编代码如下:

int a,i=0;
009E1A4E mov dword ptr [i],0
a=i++;
009E1A55 mov eax,dword ptr [i]
009E1A58 mov dword ptr [a],eax
009E1A5B mov ecx,dword ptr [i]
009E1A5E add ecx,1
009E1A61 mov dword ptr [i],ecx

从上述汇编代码可以看到,对于内置类型,它们的执行数目是一样的,效率没有差别。

3、从重载运算符来看自定义类型

Operator Operator::operator++()
{
++value; //内部成员变量
return *this;
}

Operator Operator::operator++(int)
{
Operator temp;
temp.value=value;
value++;
return temp;
}

从上面代码可以看出,后置++多了一个保存临时对象的操作,因此效率自然低一些。

总结:

对于C++内置类型,两者的效率差别不大;

对于自定义的类而言,++i 的效率更高一些。

参考文章:

http://www.cplusplus.me/1303.html

时间: 2024-08-11 05:44:33

(C++)i++和++i,哪个效率高一些的相关文章

StringBuilder的Append()方法会比+=效率高

StringBuilder strSql = new StringBuilder(); strSql.Append("select top 1 id from " + databaseprefix + "channel"); strSql.Append(" where [email protected] "); StringBuilder的Append()方法会比+=效率高,StringBuilder比StringBuffer效率略高 +=,占资

var a=[]; 和 var a=new Array(); 的区别,为什么前者效率高

因为 JSON格式的语法是引擎直接解释的.而new Array 则需要调用Array的构造器.还有就是1.当你需要将一个数字转化为字符串时可以这样定义:var s=""+1; 这样的转化最快.2.当你定义一个对象类型时:var o={}; 而已 var o=new Object();道理是同样,new Object()需要调用Object的构造器.3.在js中执行字符串替换时,或查找字符串,需要进行循环时,可以考虑使用正则,速度更快.4.尽可能的少定义.使用全局变量var a=[];

内存映射的效率要比read/write效率高

http://blog.csdn.net/hongchangfirst/article/details/11599369 我们先来看看如果不使用内存映射文件的处理流程是怎样的,首先我们得先读出磁盘文件的内容到内存中,然后修改,最后回写到磁盘上.第一步读磁盘文件是要经过一次系统调用的,它首先将文件内容从磁盘拷贝到内核空间的一个缓冲区,然后再将这些数据拷贝到用户空间,实际上是两次数据拷贝.第三步回写也一样也要经过两次数据拷贝. 所以我们基本上会有四次数据的拷贝了,因为大文件数据量很大,几十GB甚至更

MFC 消息映射表和虚函数实现消息映射到底谁的效率高

深入浅出MFC对于虚函数实现方式的缺点,它指出:虚函数耗费大量内存,系统最终将被这些额外负担拖垮.    但是现在对于容量巨大的白菜价格的内存来说,这种额外负担是否已经过时了呢~?    书中提到,虚函数表中的每一个项目都是一个函数指针,价值4字节,如果基类的虚函数表有100项 (MFC里面的消息数量是否在这个数量级?),经过十层继承,开支散叶,总共需要耗费多少内存?    我粗略地算了下,不知道这种计算方法是否正确,4Byte*100项=400Byte.如果CCmdTarget中定义100个消

java单例模式(线程安全,效率高,双重推断)

这样的方法,在获取单利的时候,避免了线程锁,导致訪问该方法速度非常慢, 同是,防止了多线程同事房屋该方法就会产生多个实例的问题. 效率高.线程安全. public class TestInstance{ private static TestInstance  instance; public static TestInstance   getInstance{ if(instance==null){ synchronized(TestInstance.class){ if(instance==

为什么存储过程比sql语句效率高?

存储过程经过预编译处理 而SQL查询没有 SQL语句需要先被数据库引擎处理成低级的指令 然后才执行 ------------------------------------------------------- 如果是只执行一次的话,存储过程不一定比SQL语句效率高.因为存储过程有个预先编译的过程.就是.启动服务器后或者第一次执行后(可以设置).就可以把存储过程加载到高速缓存中,这样以后调用起来就不用再通过编译 执行效率当然就高喽..另外执行存储过程只需要传递几个参数..用语句的话可能需要一大串

++i 和 --i 谁的效率高 ?

++i 和 --i 谁的效率高 ? 看到高手的blog有关于++i 和 --i对于循环的时候,谁的效率更高的问题(有点geek,但是我喜欢~) http://blog.csdn.net/dog250/article/details/5303375 #include<stdio.h> int main(void) { int i = 0; for(i = 0; i < 10;i++) { printf("Hello world!\n"); } return 0 ; }

java单例模式(线程安全,效率高,双重判断)

这种方法,在获取单利的时候,避免了线程锁,导致访问该方法速度很慢, 同是,防止了多线程同事房屋该方法就会产生多个实例的问题. 效率高,线程安全. public class TestInstance{ private static TestInstance  instance; public static TestInstance   getInstance{ if(instance==null){ synchronized(TestInstance.class){ if(instance==nu

答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;

http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html 1. char.varchar.nvarchar之间的区别(包括用途和空间占用):xml类型查找某个节点的数据有哪些方法,哪个效率高:使用存储 过程和使用T-SQL查询数据有啥不一样: ------------------------------------------------ SQL中char.varchar.nchar.nvarchar的区别 http://www.cn