seo技术大师,安康地seo,定制企业网站开发公司,临沂建设网站制作公司More Effective C
Basics
reference pointer
reference 必定有值#xff0c;pointer 可以为空reference 声明时必须定义#xff0c;必须初始化reference 无需测试有效性#xff0c;pointer 必须测试是否为 nullreference 可以更改指向对象的值#xff0c;但是无法…More Effective C
Basics
reference pointer
reference 必定有值pointer 可以为空reference 声明时必须定义必须初始化reference 无需测试有效性pointer 必须测试是否为 nullreference 可以更改指向对象的值但是无法指向其他对象pointer 可以指向其他对象
cast
c 转型typeexprc 转型castexpr staticjust like c 转型无类型检查dynamicbase-》derived有类型检查reinterpret二进制重新解释受制于编译期平台constamend costness or volatileness
polymorphically array
使用base array pointer处理derived array会导致未定义行为
default constructor
贸然提供default constructor需要在运行时测试是否值有效缺乏default constructor会带来束缚 无法创建对象数组只能创建指针数组可以使用 placement new 创建对象数组显式使用析构函数的 placement delete删除 使用 delete 删除 placement new 创建的对象会导致未定义行为
Operators
implicit conversion
单参数构造函数或其余参数有默认值隐式类型转换操作符隐式类型转换导致难以发现的问题 构造函数标记为 explicit定义显式类型转换asType只能进行一次隐式转换多次类型转换不会有问题
increment/decrement prefix/postfix
【i累加后取出】clazz operator() 返回引用允许i 【i取出后累加】const clazz operator(clazz) 额外参数区分参数不得使用返回const不允许i为了使得逻辑一致用increment prefix来实现increment postfix
override 、||、,
重载、||导致问题 、||条件满足/不满足会提前终止重载后左右式作为函数参数都会被执行 重载导致问题 逗号表达式先求解左式再求解右式值为右式重载后函数无法保证执行顺序
new, operator new, placement new, delete, operator delete, []
new无法重载operator new constructor placement newoperator new重载分配内存的行为 void * operator newsize_t placement new重载在指定内存上构建对象 void * operator newsize_t void* location deletedestructor operator delete placement new 分配的内存无法通过 operator delete 删除 显式析构 分配内存对应的方式删除 new-deletemalloc-free
Exceptions
程序运行出错时设置状态变量或返回错误码无法保证异常被程序处理程序可能会异常运行而抛出异常如果未进行捕获程序便会立刻终止。
delete in destructor
将资源分配在对象内在析构函数中删除内存析构函数必然会被调用防止因为异常产生未删除内存
exceptions in constructor
构造函数异常部分构造的对象不会自动析构 将所有成员变量视为RAII对象使用shared_ptr
exceptions in destructor
使用uncaught_exception判断析构函数时候正有一个exception在作用中正在处理异常的析构函数抛出未捕获的异常会导致程序终止不应该让析构函数抛出异常析构函数应该是异常安全的
stack unwinding
C异常处理栈展开机制
异常被抛出当前作用域搜索异常处理程序catch块未搜索到销毁该作用域内的局部对象 调用析构函数出现异常程序终止std::terminate 退出当前作用域继续搜索上一级作用域未处理异常std::terminatestd::abort生成核心转储文件
catch exceptions param pass
处理异常和函数传参的区别 异常永远会被复制因为异常处理程序超出函数调用作用域 按值捕获复制两次传参一次复制一次引用捕获复制一次 不发生隐式类型转换仅能发生继承类型转换异常按catch的顺序处理没有最优类型匹配 子类异常应该写在基类异常的前面否则不会被处理
catch exceptions by reference
catch by pointer无法判断是否应该删除资源catch by value子类异常由基类捕获会导致对象切割仅剩下基类行为catch by reference推荐使用且仅复制一次
exception specifications
在定义中指定函数可能抛出的异常 未指定则表明可能抛出任何异常指定noexcept表明不会抛出任何异常 抛出未定义异常会导致unexpected函数调用 unexpected的默认行为是调用terminate可以使用set_unexpected自定义处理行为 可以提供额外的异常定义说明但是违反说明的异常会直接导致程序终止
exception handling cost
异常处理会使得程序效率下降5%~10%
Efficiency
80-20 rule
80%的资源被20%的代码占用不仅需要大幅优化代码更重要的是找到那20%的瓶颈不根据经验和直觉而是使用profiler来分析那20%代码
lazy evaluation
如果计算不是绝对必要使用lazy evaluation替代eager evaluation
over-eager evaluation
cache缓存已计算的值prefetch预先从磁盘读取可能访问的值每次读取磁盘多于请求量的值
avoid temporary
临时对象≠局部对象临时对象是没有名字的栈对象 函数传参隐式类型转换 by value隐式转换为临时对象by const reference隐式转换为临时对象by non-const reference隐式转化无法被触发因为对临时对象的修改无法反馈会引用对象因此编译报错 函数返回值 使用替代返回值优化RVO
return value optimize
直接返回构造函数避免临时对象的生成
overload to avoid implicit type conversions
使用函数重载来避免没有函数重载时的隐式类型转换
supply and
操作符往往比有更高的效率重载操作符的时候提供版本
third party library
相同功能的第三方库在性能方面可能会有不同的设计和不同的效率偏重
inherit cost
virtual functions 每个class包含一个虚函数表每个对象包含一个虚函数表的指针virtual 函数无法 inline因为 inline 需要在编译期复制函数调用而 virtual 需要运行期才能确定调用函数 multiple inheritance virtual base classes 菱形继承需要virtual base class额外的指针开销 runtime type identificationRTTI typeid获取class相应的type_info需要额外的指针指向type_info可以在虚函数表中添加指向type_info的指针
Techniques
virtual constructor non-member function
virtual constructor factory function 根据参数生成不同的子类 virtual copy constructor 每个子类添加虚函数clone调用拷贝构造函数 virtual non-member function 每个子类添加虚函数实现具体操作non-member function inline化调用相应虚函数
limit class instance count
关键资源有限其对应的类示例数目也有限 零或一单例模式n在构造函数中添加static示例计数使用make函数显式构造防止隐式构造增加计数
fore constructor in/out of heap
in heap对象有自杀能力delete删除内存out of heap对象不会造成内存泄漏重载 static void * operator newsize_tstatic void operator deletevoid *
smart pointers
智能指针无法在子类和基类之间转换需要借助于隐式类型转换操作符
reference count
多数对象共享少数的实值实值的产生和删除成本高使用引用计数来记录共享对象的个数在引用计数为零时删除
proxy class
表示一个观念上不存在的对象 实现[][]重载proxy对象为Array1D
multi virtual function
根据多个子类的类型判断调用的函数 func(base*, base*) 虚函数RTTI运行时类型辨识虚函数重载自行实现虚函数表
Miscellany