简单的比较前缀自增运算符和后缀自增运算符的效率是片面的,

因为存在很多因素影响这个问题的答案。

首先考虑内建数据类型的情况:

如果自增运算表达式的结果没有被使用,

而是仅仅简单地用于增加一元操作数,

答案是明确的,前缀法和后缀法没有任何区别。

编译器的处理都应该是相同的,

很难想象得出有什么编译器实现可以别出心裁地在二者之间制造任何差异。

示例程序如下。

#include<stdio.h>

int main() {

int i=0;

int x=0;

i++;

++i;

x=i++;

x=++I;

return 0;

}

上面的代码在

VISUAL C++6.0

上编译得到的汇编如下:

;Line 5

mov  DWORD PTR_i$[dbp],0

; Line 6

mov DWORD PTR_i$[dbp],0

; Line 8

mov eax,DWORD PTR_i$[ebp]

add eax,1

mov DWORD PTR_i$[ebp],eax

; Line 9

mov eax,DWORD PTR_i$[ebp]

add eax,1

mov DWORD PTR_i$[ebp],eax

; Line 10

mov edx,DWORD PTR_i$[ebp]

mov DWORD PTR_x$[ebp],edx

mov eax,DWORD PTR_i$[ebp]

add eax,1

mov DWORD PTR_i$[ebp],eax

; Line 11

mov edx,DWORD PTR_i$[ebp]

add eax,1

mov DWORD PTR_x$[ebp],edx

mov eax,DWORD PTR_i$[ebp]

mov DWORD PTR_i$[ebp],eax

代码段第8行和第9行生成的汇编代码分别对应

Line8和Line9下面的汇编代码,可以看到3

个步骤几乎完全一样。

代码段第10行和第11行生成的汇编代码分别对应Line10和Line11下面的汇编代码,可以看到都是5个步骤,只是在加1的先后顺序上有一些区别,效率也是完全一样的。

由此说明,考虑内建数据类型时,它们的效率差别不大(除去编译器优化的影响)。

再考虑自定义数据类型(主要是指类)的情况。此时不需要再做很多汇编代码的分析,因为前缀是(++i)可以返回对象

的应用,而后缀是(i++)必须返回对象的值,所以导致在大对象的时候产生了较大的复制开销,

引起效率降低,因此使用自定义类型(注意不是指内建类型)的时候,应该尽可能地使用前缀式递增或递减。

答案:

在内建数据类型的情况下,效率没有区别。

在自定义数据类型的情况下,

++i的效率较高。

i++与++i哪个效率更高的更多相关文章

  1. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->WinForm版本新增新的角色授权管理界面效率更高、更规范

    角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...

  2. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本新增新的角色授权管理界面效率更高、更规范

    角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...

  3. Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...

  4. MySQL select * 和把所有的字段都列出来,哪个效率更高?

    MySQL select * 和把所有的字段都列出来,哪个效率更高 答案是:如何,都不推荐使用 SELECT * FROM (1)SELECT *,需要数据库先 Query Table Metadat ...

  5. Http请求封装(对HttpClient类的进一步封装,使之调用更方便。另外,此类管理唯一的HttpClient对象,支持线程池调用,效率更高)

    package com.ad.ssp.engine.common; import java.io.IOException; import java.util.ArrayList; import jav ...

  6. 在类中,调用这个类时,用$this->video_model是不是比每次调用这个类时D('Video')效率更高呢

    在类中,调用这个类时,用$this->video_model是不是比每次调用这个类时D('Video')效率更高呢  

  7. 取代 Mybatis Generator,这款代码生成神器配置更简单,开发效率更高!

    作为一名 Java 后端开发,日常工作中免不了要生成数据库表对应的持久化对象 PO,操作数据库的接口 DAO,以及 CRUD 的 XML,也就是 mapper. Mybatis Generator 是 ...

  8. 数据库查询SQL语句的时候如何写会效率更高?

    引言 以前刚开始做项目的时候,开发经验尚浅,遇到问题需求只要把结果查询出来就行,至于查询的效率可能就没有太多考虑,数据少的时候还好,数据一多,效率问题就显现出来了.每次遇到查询比较慢时,项目经理就会问 ...

  9. 20 个让你效率更高的 CSS 代码技巧

    在这里想与你分享一个由各大CSS网站总结推荐的20个有用的规则和实践经验集合.有一些是面向CSS初学者的,有一些知识点是进阶型的.希望每个人通过这篇文章都能学到对自己有用的知识. 1.注意外边距折叠 ...

随机推荐

  1. c#错误捕获如何定位到某一行?

    e.ToString()在调试版本的程序(并且有pdb文件)的情况下会输出源代码行.

  2. Hadoop学习笔记Hadoop伪分布式环境建设

    建立一个伪分布式Hadoop周围环境 1.主办(Windows)顾客(安装在虚拟机Linux)网络连接. a) Host-only 主机和独立客户端联网: 好处:网络隔离: 坏处:虚拟机和其他serv ...

  3. OpenCV面、人眼检测

    /* 功能:实现对眼睛.脸部的跟踪. 版本号:1.0 时间:2014-4-27 */ #include <opencv2/objdetect/objdetect.hpp> #include ...

  4. Apple Watch 1.0 开发介绍 1.3 简介 WatchKit App 架构

    WatchKit app和WatchKit extension一起实现了app的界面.当用户在Apple Watch中操作时,WatchKit app从storyboards中选择合适的场景.比如,如 ...

  5. Java设计模式菜鸟系列(两)建模与观察者模式的实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577 观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一 ...

  6. UVA 1291 Dance Dance Revolution(DP)

    意甲冠军:跳舞机有一个上5积分,分别central, top, bottom, left, right分,区区足站立还是需要1点物理,从一个单纯的脚central点上须要2点体力,从一个点上移动到相邻 ...

  7. css3 shadow为了实现各种漂亮的阴影效果

    <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/h ...

  8. IOS开发——手动设置屏幕旋转

    在移动开发过程.您可能需要跨越看看你的手机.有可能是所有的接口必须跨越,有可能是一个交叉通过电话,当用户当,你的接口也希望他能跨越.还有可能的是,界面的一部分需要被侧向显示.视情况而定,有不同的方法来 ...

  9. Oracle之Check约束实例具体解释

    Oracle | PL/SQL Check约束使用方法具体解释 1. 目标 实例解说在Oracle中怎样使用CHECK约束(创建.启用.禁用和删除) 2. 什么是Check约束? CHECK约束指在表 ...

  10. form 为什么上传文件enctype现场

    FORM要素enctype属性指定表单数据server当提交所使用的编码类型,默认默认值它是"application/x-www-form-urlencoded". 这样的编码方式 ...