如何写出高效C++(实现)

26.尽可能延后变量定义式的出现时间

你不止应该延后变量的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初值实参位置,好处是不仅能够避免构造(和析构)非必要对象,还可以避免无意义的default构造行为。

对于循环而言有如下两个计划

A:定义变量于循环外,则一个构造函数一个析构函数和n个赋值操作

B:定义变量于循环内,则n个构造函数和n个析构函数

除非你知道

(1)赋值成本比"构造+析构"成本低

(2)你正在处理代码中效率高度敏感的部分

否则用B吧


27.尽量少做转型动作

关于C语言的不再论述

C++提供的四种新式转型:

const_cast<T>(expression)//将对象的常量性转除

dynamic_cast<T>(expression)//安全向下转除,用来决定某对象是否归属继承体系中的某个类型。

reinterpret_cast<T>(expression)//低级转型,很少用,实际动作和结果取决于编译器,它不可移植,pointer to int转换为int

static_cast<T>(expression)//强迫隐式转换,比如non-const对象转换为const对象,或者将int转换为double对象等等。

如果可以,尽量避免转型,尤其是在注重效率的代码中避免dynamic_casts,如果有个设计需要转型动作,使者发展无需转型的替代设计。


28.避免返回handles指向对象内部成分

handles(包括reference,指针,迭代器)指向对象内部。遵守这个条款可增加封装性,帮助const成员函数的行为像个const,并将发生"虚吊号码牌"的可能性降至最低。


29.为"异常安全"而努力是值得的

"异常安全"的两个条件:

(1)不泄露任何资源

(2)不允许数据败坏

异常安全函数会提供以下的三个保证之一:

(1)基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效状态下

(2)强烈保证:如果异常被抛出,程序状态不改变,如果函数成功,那就是完全成功,如果函数失败,程序会回复到"调用函数之前"的状态。

(3)不抛掷保证:承诺绝不抛出异常,因为它们总是能够完成它们原先承诺的功能。

如何让代码具有异常安全性:

首先“以对象管理资源”阻止资源泄露,然后是挑选三个"异常安全保证"中的一个实施于每一个函数身上。

强烈保证往往能够以copy-and-swap实现出来,但是"强烈保证"并非对所有函数都可实现或具备现实意义。


30.透彻了解inlining的里里外外

inline函数,将“对此函数的每一个调用”都用函数本体替换之。

将函数定义于calss定义式内的话那就是隐喻的inline

如果friend函数也可被定义于class内,那么它们也是被隐喻声明为inline。

所谓的明确声明方法,就是在定义式前加上关键字inline。

大部分编译器拒绝太过复杂(例如带有循环或者递归)的函数inlining,而所有对virtual函数的调用也都会使inlining落空

构造函数和析构函数是inlining的糟糕人选。


31.将文件的编译依存关系降到最低

支持"编译依存性最小化"的一般构想是:相依于声明式,不要相依于定义式,基于此构想的两个手段是handle classer和interface classes

程序库头文件应该以"完全且仅有声明式"的形式存在,这种做法不论是否涉及templates都适用。然后可以通过把这些函数转交给相应的实现类并由后者完成实际工作来实现函数的使用。



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值