科研和工程中的C++编程3_代码优化.pptVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
科研和工程中的C++编程 代码优化 代码优化 剖析(profile) 利用工具分析程序代码,调用频率,计算时间等。要防止: (1)优化了错误的代码:若一个程序的主要指标不是效率,那么一切花在使其更高效上的时间都是浪费。靠直觉来判断哪段代码的主要指标是效率是不可信的,只有直接去测量。 (2)程序员经常“优化”到降低了代码的速度。这在C++是一个典型问题,一个简单的指令行可能会产生巨大数量的机器代码,应当经常检查编译器的输出,并且剖析之*。 代码优化 构造和析构: 未经认真设计的程序经常花费不少时间在调用构造函数,拷贝对象以及初始化临时对象等等。 代码优化 即便arg为0,也付出了调用Object的构造函数的代价。特别是如果arg经常是0,并且Object本身还分配内存,这种浪费会更加严重。显然的解决方案就是把obj的定义移到判断之后。 在循环中定义复杂变量要注意,若在循环中按照除非需要否则不构造的原则构造了复杂的对象,那么在每一次循环的时候都要付出一次构造的代价。最好在循环外构造之,并只构造一次。如果一个函数在内循环中被调用,而该函数在栈内构造了一个对象,那么可以在外部构造并传递一个引用给它。 代码优化 尽量采用初始化列表,类中的成员类对象,如果在构造方法里初始化,一般是使用了等号操作符,这样就等于是调用了无参数构造方法一次,再调用一次等号操作符。而使用初始化列表则直接调用其拷贝构造方法*。 要前自增不要后自增(即要++A不要A++),后自增会产生临时对象,调用构造方法。对于整数,这没有额外的负担,但对于用户自定义类型,这就是浪费。 代码优化 尽量少使用有返回值的操作符,如T operator+(const T)等,它返回时将构造临时对象,调用构造方法。 可尝试C++0x引入的新的语法:右值引用。 操作符+-*/%等都需要被设计成有返回值的方法,因此方法体内部出错时,只能以抛出异常的方式来通知调用者。 代码优化 构造方法尽可能写轻量级代码,有些成员初始化可以使用两步的方法,构造方法什么都不作,另外设计一个方法来初始化成员。 要注意类型转换会产生隐藏的临时对象,所以要针对各种类型重载操作符方法。 代码优化 虚函数: 虚函数的机制很简单。为了完成一个对象的虚函数调用,编译器访问对象的虚函数表,获得一个成员函数的指针,设置调用环境,然后跳转到该成员函数的地址上。一个虚函数调用的额外负担是虚函数表的间接指向;由于事先并不知道将要跳转的地址,所以也有可能造成处理器不能命中Cache。 代码优化 一般的C++程序都对虚函数有大量的使用,所以主要的手段是防止在那些极其重视效率的地方的虚函数调用。可以改成内联函数以省去函数调用的开销,也可以利用模版类的特点使用mix-in class模式(混同体,设计模式书中是策略模式)。如下图: 代码优化 代码优化 其中的模版参数T是最终派生类。这样在CXXX实例中调用XXX()方法时,将调用最终派生类CXXX中重载的DoXXX()方法,也做到了多态,但省去了虚函数表的调用开销。 Windows下ATL编程还可以在父类上进一步加ATL_NO_VTABLE关键字,如class ATL_NO_VTABLE CXXXImpl,目的使得父类构造方法不初始化虚函数表,从而优化时把父类虚函数表及虚函数体从最后生成的模块中删除,从而减少了可执行文件的大小,进而减少内存页的切换。 代码优化 在很小的、频繁使用的类上使用任何虚函数会造成额外的负担,这些都是不能接受的。由于继承一般都要用到一个或几个虚函数(至少有一个虚的析构函数),所以没必要在小而频繁使用的对象上使用任何继承。当然,继承的层次越少越好,一般3~5层足够。 代码优化 MFC、Qt、WxWidget、C#、Java等都使用了单根的类继承体系,显然它们都会有上面的问题,而且用单根继承来描述世界有点怪异,使用多继承组合、概念泛化、基于对象的设计来描述世界就比较自然。 关于C++类对象的内存布局,参考书有: 《深入探索C++物件模型》 代码优化 函数/方法参数的设计尽可能使用简单的类型,这样可以减少额外的类方法的调用。若参数类型为类,在隐式类型转换中就会调用构造方法,造成额外的调用负担。如: void Foo(std::string str) {…} Foo(“aaa”); 代码优化 这里对Foo()的调用包括了对给定const char*参数的构造函数的调用。在一般的实现中,这个构造函数执

文档评论(0)

光光文挡 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档