effective c++ 第五章最后部分
条款28:避免返回handles指向对象内部成分
因为函数返回的是一个临时对象,当语句执行完对象会被析构掉,会发生虚吊现象。
条款29:为“异常安全”而努力是值得的
带有异常安全性的函数会:
不泄露任何资源
不允许数据败坏
提供三大保证之一:
基本承诺:异常抛出,程序内的事物仍是处于有效状态
强烈保证:如果异常被抛出,程序状态不改变。如果函数成功,就是完全成功,如果函数失败,程序会恢复到调用函数之前的状态。
不抛掷保证:承诺绝不抛出异常,因为总是会完成原先承诺的功能
条款30:透彻了解inlining 的里里外外
对此函数的每一个调用都会以函数本体替换之,但这样有可能增加目标码,如果inline函数的本体很小,可能导致较小的目标码和较高的指令高速缓存装置击中率。
记住,inline只是对编译器的一个申请,不是强制命令。可以明确提出或隐喻提出,隐喻方式是将函数定义于class定义域内,明确提出则是在定义式前加inline.
Template通常也置于头文件内,因为它一旦被使用,编译器为了将它具现化,需要知道它长什么样子。
Template的具现化与inlining无关。
一个表面看起来inlining的函数是否真实inline,取决于你的建置环境,主要取决于编译器
有时候虽然编译器有意愿inlining某个函数,还是可能为该函数生成一个函数本体。如果程序要取某个inlining函数的地址,编译器通常必须函数生成一个outlined函数本体。毕竟编译器 哪有能力提出一个指针指向并不存在的函数呢?与此并提的是,编译器通常不对通过函数指针而进行的调用实施inlining.
条款31:将文件间的编译依存关系降至最低。