16-谨记80-20法则
Created|Updated|计算机编程语言1-EffectiveC++_35个改善条款_学习笔记
|Post Views:
第三章,异常
条款15 了解异常处理(exception handling)的成本
(1)80-20法则: 一个程序80%的资源用于20%的代码上。这是大部分程序被反复验证的事实。
(2)重要概念: 一个程序的整体性能几乎总是由其构成要素(代码)的一小部分决定。
(3)找到性能瓶颈的代码,提升整体程序性能的可行之道:(如果依靠,猜测东一块西一块的改善程序,其结果可能还是不尽人意) 借助程序分析器,根据观察或实验识别出那20%的性能瓶颈代码
(4)满足的条件的程序分析器: 直接测量核心资源(CPU / 内存 / IO 等) 、数据可复现且覆盖数据维度全。
(5)推荐: Windows Performance Toolkit (WPT)
Author: LYJ
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles
2025-10-15
01-区别指针和引用
第一章,基础议题条款1 仔细区别Pointers和References指向指定的对象,且之后不切换指向其他对象,且操作符重写需要时使用References,反之使用Pointers,且使用References不需要检测是否为null ...
2025-10-16
02-最好使用C++转型操作符
第一章,基础议题条款2 最好使用C++转型操作符强制转换带来的问题: (1)直接将任意类型转为其他任意类型,意图不明确且显得拙劣,如:将基类类型转为派生类类型,或者将常量类型转为非常量类型,但仅仅通过小括号强转并不能很好的表明意图 (2)强转使用小括号来实现,但小括号在编码中使用到的地方很多,很难直接一眼看出有哪些是类型转换,哪些又是函数调用等使用到小括号的地方,这显得很不专业 使用C++转型操作符: 为解决强转带来的问题,C++导入了4个新的转型操作符: (1)static_cast (2)const_cast (3)dynamic_cast (4)reinterpret_cast 与C强制转换的比较C++转型操作符基本拥有强转一样的威力和意义,以及相同的限制,如: 不能将double转为pointer,或者将struct转为int; static_cast不能移除常量性,因为专门有const_cast来负责 C++转型操作符的使用: (1)C++转型操作符更加集中他们自己负责的转型内容,const_cast只负责将类型转为常量或者非常量,其他的并不关注,如果被用于这个场景之外...
2025-10-17
03-不要以多态方式处理数组
第一章,基础议题条款3 不要以多态方式处理数组问题场景描述(1):在C++中,可以通过指向基类的指针来操作派生类对象,这个指针就好像有多重类型一样,原著笔者在这里称将其也称为多态,这种多态操作方式应该避免数组操作,概括一下是因为基类和派生类的成员很可能是不一样的,这也就意味着他们的对象大小是不一样的,而数组arr[i]的调用就相当于*(arr+i*sizeof(object)),这个i的步进值取决于元素的大小,因此会引发“未定义”错误 class BST{...};class BalancedBST : public BST{...};void printBSTArray(ostream& s, const BST array[],int numElements){ for(int i = 0; i < numElements; i++) s << array[i];}BST BSTArray[10];printBSTArray(BSTArray);//All Right!Bala...
2025-10-18
04-非必要不提供 default constructor
第一章,基础议题条款4 非必要不提供 default constructor描述凡是可以“合理无中生有”的对象类型应该有默认构造,反之如果存在没有外来信息就无法正常初始化的对象,就应该禁止默认构造; 一、没有默认构造的使用限制_1: 由于没有默认构造函数,将无法产生对应类型对象构成的数组 class EquipmentPiece{public: EquipmentPiece(int IDNumber);//定义了构造函数,编译器将不再生成默认构造函数 ...}EquipmentPiece bestPieces[10];// 错误,无法调用EquipmentPiece的构造函数EquipmentPiece *bestPieces = new EquipmentPiece[10];// 错误 有3个方法可以解决无默认构造无法产生数组的问题: 1、使用non-heap 数组,于是便能够在定义数组时提供必要的自变量:int ID1,ID2,ID3,...,ID10;...EquipmentPiece bestPieces[] = { Equipm...
2025-10-19
05-对定制的“类型转换”函数保持警惕
第二章,操作符条款5 对定制的“类型转换”函数保持警惕描述自定义隐式类型转换函数,易导致代码行为异常、编译歧义,非必要不使用,使用时需严格限制。 一、两类隐式类型转换的来源1、转换运算符格式:operator 目标类型() const;,将类对象隐式转为目标类型。 class Rational {public: int n, d; operator double() const { return (double)n/d; } // Rational→double};Rational r(1,2);double x = r * 2.0; // 自动转换为double运算 2、单参数构造函数含默认参数的多参构造也归为此类,允许参数类型隐式转为类对象。 class Rational {public: Rational(int n, int d=1) : n(n), d(d) {} // int→Rational};Rational r1(1,2);Rational r2 = r1 + 5...
2025-10-20
06-区别increment与decrement操作符的前置和后置形式
第二章,操作符条款6 区别increment与decrement操作符的前置和后置形式描述重载操作符++和- -有前置式和后置式,主要通过后置式在参数中写有int自变量来做区分 class UPInt{public: UPInt& operator++(); //前置 ++ const UPInt operator++(int);//后置 ++ UPInt& operator--(); //前置 -- const UPInt operator--(int); //后置 -- UPInt& operator+=(int);// +=操作符,结合UPInts和ints};UPInt i;++i; //i.operator++();i++; //i.operator++(0);--i; //i.operator--();i--; //i.operator--(0); 前置式与后置式重载的实现前置式的意义:increment and fetch 累加然后取出; 后置式的意义: fetch and increment...
Announcement
This is Seagull Blog
Post Series
