- 博客(19)
- 资源 (8)
- 收藏
- 关注
原创 More Effective C++读书笔记19
Item 21:通过重载避免隐式类型转换 如果是自定义类型进行隐式的类型转换,肯定会调用构造和析构函数,这样就一定会有一定的开销,那么如何避免这类隐式类型转换呢?21小节给出一个方式就是通过重载函数避免进行隐式类型转换。 class UInt { public: const UInt operator+(const UInt& lrs, const UInt& hrs);
2013-01-26 17:51:43 724
原创 More Effective C++读书笔记18
Item 20:协助完成返回值优化 返回对象时的开销会比较大,会调用对象的构造和析构函数,但是当一个函数必须要返回对象时,这种构造和析构造成的开销是无法消除的。那么还能优化么? 以某种方法返回对象,能让编译器消除临时对象的开销,这样编写函数通常是很普遍的。这种技巧是返回constructor argument而不是直接返回对象。你可以这样做: const Rational o
2013-01-19 16:29:53 559
原创 More Effective C++读书笔记17
这里提到一个概念Over-eager evaluation,可以理解为超前计算,主要有两种方法caching和 prefething,都是以空间换时间来提高效率。 看到这章,让我想起了我以前做的两个项目,一个是给某直辖市做的全市联网XX系统,一个是给某发电厂做的监控环境系统。 1.全市联网系统,由于数据量非常大,导致的性能瓶颈就是每次查询数据库都会很慢,
2013-01-17 09:55:55 678
原创 More Effective C++读书笔记16
Item 17:考虑使用lazy evaluation(懒惰计算法) 首先说说使用lazy evaluation的优点,主要是能提高程序效率。延时计算,有可能避免不必要的计算,或者是只需用计算部分结果,而不需要全部结果,这些都可以称为lazy evaluation。C++本身是early evaluation,它需要程序员自己实现lazy evaluation,这样大大增
2013-01-16 10:13:42 625
原创 More Effective C++读书笔记15
Item 16:牢记 80-20 准则(80-20 rule) 80-20 准则说的是大约 20%的代码使用了 80%的程序资源;大约 20%的代码耗用了大约 80%的运行时间;大约 20%的代码使用了 80%的内存;大约 20%的代码执行 80%的磁盘访问;80%的维护投入于大约 20%的代码上;通过无数台机器、操作系统和应用程序上的实验这条准则已经被再三地验证过。80-2
2013-01-15 10:00:25 607
原创 More Effective C++读书笔记14
Item 14:审慎使用异常规格(exception specifications) 何为异常规格,通俗的理解就是对异常的规范的说明。它明确地描述了一个函数可以抛出什么样的异常。但是它不只是一个有趣的注释。编译器在编译时有时能够检测到异常规格的不一致。而且如果一个函数抛出一个不在异常规格范围里的异常,系统在运行时能够检测出这个错误,然后一个特殊函数unexpected将被
2013-01-12 11:39:41 578
原创 More Effective C++读书笔记13
Item 13:通过引用(reference)捕获异常 为什么要通过引用捕获异常,引用捕获异常相对值和指针捕获有何优点? 通过Item12学习可以看到首先,值捕获异常会调用拷贝构造函数2次,而引用捕获只有一次,效率方面,引用要高于值。可以按效率高低进行下排序,由高到低:指针->引用->值。 其次值传递在继承体系中会导致slice问题,即子类会被切割为基类。通过这两点就可
2013-01-11 11:47:18 684
原创 More Effective C++读书笔记12
Item 12:理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异 你调用函数时,程序的控制权最终还会返回到函数的调用处,但是当你抛出一个异常时,控制权永远不会回到抛出异常的地方。 把一个对象传递给函数或一个对象调用虚拟函数与把一个对象做为异常抛出,这之间有三个主要区别。 第一、异常对象在传递时总被进行拷贝;当通过传值方式捕获时,异常对象被拷贝了两次。对象
2013-01-11 11:17:23 729
原创 More Effective C++读书笔记11
Item 11:禁止异常信息(exceptions)传递到析构函数外 书中所言,会有两种情况调用析构函数。第一种是在正常情况下删除一个对象,例如对象超出作用域或者显示delete。第二种是异常传递的堆栈辗转开解(stack-unwinding)过程中,由异常处理系统删除一个对象。在一个异常被激活的同时,析构函数也抛出异常,并导致程序控制权转移到析构函数外,C++将调用 ter
2013-01-10 10:54:37 701
原创 More Effective C++读书笔记10
Item 10:在构造函数中防止资源泄漏 该条款讲述的内容跟上一条款很相似,应该都可以归属为编写异常安全代码范畴。在构造函数中尽量处理简单的代码,防止抛异常,因为C++并没有对构造函数异常做析构的动作,并不会在构造函数发生异常的情况下,调用析构函数去释放资源。这是考虑到效率问题。 我们还是举个例子更直观的描述如何在构造函数中编写异常安全的代码,要做个通讯录类,内容包括姓名,地址,图片和一段
2013-01-09 11:49:32 754
原创 More Effective C++读书笔记9
Item 9:使用析构函数防止资源泄漏 这一章我觉得可以算作是异常安全处理的一种情况,也就是说在异常发生的情况下,保证资源能被正确释放。 这里分为两种情况来讨论, 一是指针操作 举个例子: void myFucntion() { Object* obj = getBack(); obj->doSomething(); delete obj; } 如果在
2013-01-08 11:54:32 907 1
原创 More Effective C++读书笔记8
Item 8:理解各种不同含义的new和delete new操作符在C++中做了两件事,1是在堆上分配足够的内存,2是调用类的构造函数。new操作法的这种行为是程序员无法改变的,唯一程序员可以去做的就是按自己的需求来修改内存分配,通过重载operator new函数(void* operator new(size_t size))来自定义内存的分配,但是在调用构造函数上面是由
2013-01-07 11:10:18 562
原创 More Effective C++读书笔记7
Item 7:不要重载“&&”,“||”, 或“,” C/C++中“&&”和“||”操作符是采用短路计算法的,而且是有顺序的。即从左往右计算,如果一旦确认表达式的值,那么后面的表达式或计算不再执行。而重载运算符本质上是函数重载,即运算符操作为函数操作。operator &&()有两种情况,一是全局重载,二是作为类成员函数;如果是全局重载,那么调用本质为 "operator
2013-01-06 11:39:52 678
原创 More Effective C++读书笔记6
Item 6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别 class UPInt { public: ... UPInt& operator++(); //前缀形式 const UPInt operator++(int); //后缀形式 UPInt& operator--();
2013-01-06 09:22:03 976
原创 More Effective C++读书笔记5
Item 5:谨慎定义类型转换函数 隐式类型转换时在编译期间由编译器来执行的。除了C/C++默认的基本类型的隐式类型转换外,用户自定义类型的隐式转换方式有两种: 1.定义隐式类型转换运算符 2.单参数构造函数或者多参数构造函数,但第一个参数以后的参数都有默认值。 隐式类型转换运算符例子: class Rational { public: Rational(int nume
2013-01-05 12:18:58 798
原创 More Effective C++读书笔记4
Item 4:避免无用的缺省构造函数 没有缺省构造函数会导致: 1.无法创建该类的数组形式。 2.无法在许多基于模板的容器类里使用。 设计虚基类时所面临的要提供缺省构造函数还是不提供缺省构造函数的两难决策: 1.不提供缺省构造函数的虚基类,很难与其进行合作。因为几乎所有的派生类在实例化时都必须给虚基类构造函数提供参数。 2.提供无意义
2013-01-05 09:43:10 602
原创 More Effective C++读书笔记3
Item 3: 不要对数组使用多态 语言规范中说通过一个基类指针来删除一个含有派生类对象的数组,结果将是不确定的。 class BST { ... }; class BalancedBST: public BST { ... }; void printBSTArray(ostream& s,const BST array[], int numElements) {
2013-01-05 09:42:59 710
原创 More Effective C++ 读书笔记2
Item 2:尽量使用C++风格的类型转换 1. C语言的类型转换缺点 1.1 过于粗鲁,允许在任何类型之间进行转换。 1.2 在程序语句中难以识别。 1.3 类型转换失败不可获知。 2. C++类型转换符的介绍 2.1. static_cast 在功能上基本上与 C 风格的类型转换一样强大,含义也一样。但是,static_cast 不能从表达式中去除 const 属性。 2.2.
2013-01-05 09:42:45 742
原创 More Effective C++ 读书笔记1
Item 1: 指针和引用的区别 1.指针可以为空值,引用不可以引用不可以为空值的好处是可以省略判断,提高代码效率。 void Test(const int& count) { cout << count << endl; } void Test(const int* count) { if(NULL != count) { cout <<
2013-01-05 09:42:34 1137 2
基于USB摄像头的音视频对讲
2010-09-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人