自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 More Effective C++ 条款23

条款23:考虑变更程序库程序库的设计就是一个折衷的过程。理想的程序库应该是短小的、快速的、强大的、灵活的、可扩展的、直观的、普遍适用的、具有良好的支持、没有使用约束、没有错误的。这也是不存在的。为尺寸和速度而进行优化的程序库一般不能被移植。具有大量功能的的程序库不会具有直观性。没有错误的程序库在使用范围上会有限制。真实的世界里,你不能拥有每一件东西,总得有付出。不同的设计者给这些条件赋予了

2001-10-29 21:34:00 1258

原创 More Effective C++ 条款24

条款24:理解虚拟函数、多继承、虚基类和RTTI所需的代价此文包含一些图片,无法贴到文档区,所以我把word文档压成zip文件放在了文件交流区,请下载阅读,请下载C++编译器们必须实现语言的每一个特性。这些实现的细节当然是由编译器来决定的,并且不同的编译器有不同的方法实现语言的特性。在多数情况下,你不用关心这些事情。然而有些特性的实现对对象大小和其成员函数执行速度有很大的影响,所以对于这些

2001-10-28 22:00:00 1850

原创 More Effective C++ 条款22

 条款22:考虑用运算符的赋值形式(op=)取代其单独形式(op)大多数程序员认为如果他们能这样写代码:x = x + y;                    x = x - y;那他们也能这样写:x += y;                       x -= y;如果x和y是用户定义的类型(user-defined type),就不能确保这样。就C++来说,op

2001-10-25 21:57:00 1166

原创 More Effective C++ 条款21

 条款21:通过重载避免隐式类型转换以下是一段代码,如果没有什么不寻常的原因,实在看不出什么东西:class UPInt {                                 // unlimited precisionpublic:                                       // integers 类  UPInt(); 

2001-10-25 21:55:00 1031

原创 More Effective C++ 条款20

条款20:协助完成返回值优化一个返回对象的函数很难有较高的效率,因为传值返回会导致调用对象内的构造和析构函数(参见条款19),这种调用是不能避免的。问题很简单:一个函数要么为了保证正确的行为而返回对象要么就不这么做。如果它返回了对象,就没有办法摆脱被返回的对象。就说到这。考虑rational(有理数)类的成员函数operator*:class Rational {public:

2001-10-20 16:37:00 1078

原创 More Effective C++ 条款18

 条款18:分期摊还期望的计算在条款17中,我极力称赞懒惰的优点,尽可能地拖延时间,并且我解释说懒惰如何提高程序的运行效率。在这个条款里我将采用一种不同的态度。这里将不存在懒惰。我鼓励你让程序做的事情比被要求的还要多,通过这种方式来提高软件的性能。这个条款的核心就是over-eager evaluation(过度热情计算法):在要求你做某些事情以前就完成它们。例如下面这个模板类,用来表示放有大

2001-10-18 23:13:00 972

原创 More Effective C++ 条款19

条款19:理解临时对象的来源当程序员之间进行交谈时,他们经常把仅仅需要一小段时间的变量称为临时变量。例如在下面这段swap(交换)例程里:templatevoid swap(T& object1, T& object2){  T temp = object1;  object1 = object2;  object2 = temp;}通常把temp叫做临时变量。

2001-10-18 23:00:00 1177

原创 More Effective C++ 条款17

 条款17:考虑使用lazy evaluation(懒惰计算法)从效率的观点来看,最佳的计算就是根本不计算,那好,不过如果你根本就不用进行计算的话,为什么还在程序开始处加入代码进行计算呢?并且如果你不需要进行计算,那么如何必须执行这些代码呢?关键是要懒惰。还记得么?当你还是一个孩子时,你的父母叫你整理房间。你如果象我一样,就会说“好的“,然后继续做你自己的事情。你不会去整理自己的房

2001-10-17 10:22:00 851

原创 More Effective C++ 条款16

效率我怀疑一些人在C++软件开发人员身上进行秘密的巴甫洛夫试验,否则为什么当提到“效率”这个词时,许多程序员都会流口水。(Scott Meyers真幽默  译者注)事实上,效率可不是一个开玩笑的事情。一个太大或太慢的程序它们的优点无论多么引人注目都不会为人们所接受。本来就应该这样。软件是用来帮助我们更好地工作,说运行速度慢才是更好的,说需要32MB内存的程序比仅仅需要16MB内存的程序好,

2001-10-14 23:36:00 901

原创 More Effective C++ 条款15

 条款15:了解异常处理的系统开销为了在运行时处理异常,程序要记录大量的信息。无论执行到什么地方,程序都必须能够识别出如果在此处抛出异常的话,将要被释放哪一个对象;程序必须知道每一个入口点,以便从try块中退出;对于每一个try块,他们都必须跟踪与其相关的catch子句以及这些catch子句能够捕获的异常类型。这种信息的记录不是没有代价的。确保程序满足异常规格不需要运行时的比较(runti

2001-10-13 15:51:00 772

原创 More effective C++ 条款14

 条款14:审慎使用异常规格(exception specifications)毫无疑问,异常规格是一个引人注目的特性。它使得代码更容易理解,因为它明确地描述了一个函数可以抛出什么样的异常。但是它不只是一个有趣的注释。编译器在编译时有时能够检测到异常规格的不一致。而且如果一个函数抛出一个不在异常规格范围里的异常,系统在运行时能够检测出这个错误,然后一个特殊函数unexpected将被自动地

2001-10-10 22:38:00 797

原创 More effective c++ 条款10(上)

条款10:在构造函数中防止资源泄漏(上)如果你正在开发一个具有多媒体功能的通讯录程序。这个通讯录除了能存储通常的文字信息如姓名、地址、电话号码外,还能存储照片和声音(可以给出他们名字的正确发音)。为了实现这个通信录,你可以这样设计:class Image {                        // 用于图像数据public:  Image(const string& image

2001-10-10 18:26:00 931

原创 More effective c++ 条款10(下)

条款10:在构造函数中防止资源泄漏(下) 你可能已经注意到BookEntry构造函数的catch块中的语句与在BookEntry的析构函数的语句几乎一样。这里的代码重复是绝对不可容忍的,所以最好的方法是把通用代码移入一个私有helper function中,让构造函数与析构函数都调用它。class BookEntry {public:  ...                      //

2001-10-10 18:24:00 920

原创 More effective C++ 条款12

条款12:理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异 从语法上看,在函数里声明参数与在catch子句中声明参数几乎没有什么差别:class Widget { ... };                 //一个类,具体是什么类                                      // 在这里并不重要void f1(Widget w);    

2001-10-08 21:32:00 986

原创 More effective C++ 条款13

 条款13:通过引用(reference)捕获异常当你写一个catch子句时,必须确定让异常通过何种方式传递到catch子句里。你可以有三个选择:与你给函数传递参数一样,通过指针(by pointer),通过传值(by value)或通过引用(by reference)。我们首先讨论通过指针方式捕获异常(catch by pointer)。从throw处传递一个异常到catch子句是一

2001-10-08 21:31:00 857

原创 More Effective C++ 条款11

条款11:禁止异常信息(exceptions)传递到析构函数外在有两种情况下会调用析构函数。第一种是在正常情况下删除一个对象,例如对象超出了作用域或被显式地delete。第二种是异常传递的堆栈辗转开解(stack-unwinding)过程中,由异常处理系统删除一个对象。在上述两种情况下,调用析构函数时异常可能处于激活状态也可能没有处于激活状态。遗憾的是没有办法在析构函数内部区分出这两种情况

2001-10-06 23:33:00 953

原创 More Effective C++ 条款9

 异常C++新增的异常(exception)机制改变了某些事情,这种改变是深刻的,彻底的,可能是令人不舒服的。例如使用未经处理的或原始的指针变得很危险。资源泄漏的可能性增加了。写出具有你希望的行为的构造函数与析构函数变得更加困难。特别小心防止程序执行时突然崩溃。执行程序和库程序尺寸增加了同时运行速度减少了。这就使我们所知道的事情。很多使用C++的人都不知道在程序中使用异常,大多数人不知道如

2001-10-02 16:56:00 1009

原创 More Effective C++ 条款8

 条款8:理解各种不同含义的new和delete人们有时好像喜欢故意使C++语言的术语难以理解。比如说new操作符(new operator)和operator new的区别。当你写这样的代码:string *ps = new string("Memory Management");你使用的new是new操作符。这个操作符就象sizeof一样是语言内置的,你不能改变它的含义,它

2001-10-01 09:46:00 1212

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除