自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

位置不能带来自由,能力才能让人自由

  • 博客(51)
  • 收藏
  • 关注

原创 读书笔记MoreEffectiveC++(35)

让自己习惯使用标准C++语言1.增加了新的特性:RTTI、命名空间、bool,关键字mutable 和explicit,对枚举的重载操作,已及在类的定义中初始化const static 成员变量。2.模板被扩展了:现在允许了成员模板,增加了强迫模板实例化的语法,模板函数允许无类型参数,模板类可以将它们自己作为模板参数。3.异常处理被细化了:异常规格申明在编译期被进行更严格的检查,une

2015-07-30 20:23:30 343

原创 读书笔记MoreEffectiveC++(34)

如何在同一程序中混合使用C++和C1.:在main 执行前和执行后都有大量代码被执行。尤其是,静态的类对象和定义在全局的、命名空间中的或文件体中的类对象的构造函数通常在main 被执行前就被调用。这个过程称为静态初始化(参见Item E47)。这和我们对C++和C 程序的通常认识相反,我们一直把main 当作程序的入口。同样,通过静态初始化产生的对象也要在静态析构过程中调用其析构函数;这个过程

2015-07-30 20:05:07 365

原创 读书笔记MoreEffectiveC++(33)

将非尾端类设计为抽象类1.绝大部分纯虚函数都没有实现,但纯虚析构函数是个特例。它们必须被实现,因为它们在派生类析构函数被调用时也将被调用。而且,它们经常执行有用的任务,诸如释放资源(见Item M9)或纪录消息。实现纯虚函数一般不常见,但对纯虚析构函数,它不只是常见,它是必须。

2015-07-30 19:24:35 387

原创 读书笔记MoreEffectiveC++(32)

在未来时态下开发程序1.努力提供这样的类,它们的操作和函数有自然的语法和直观的语义。和内建数据类型的行为保持一致:拿不定主意时,仿照int 来做。2.要使得自己的类易于被正确使用而难以误用。要承认用户可能犯错误,所以要将你的类设计得可以防止、检测或修正这些错误3.你需要虚析构函数,只要有人delete 一个实际值向D 的B *。4.如果一个公有基类没有虚析构函数,所有的派生类基其成

2015-07-30 16:26:36 310

原创 读书笔记MoreEffectiveC++(31)

让函数根据一个以上的对象来决定怎么虚拟1.基类总是抽象的。 2.无名命名空间中的东西是当前编译单元(其实就是当前文件)私有的--很象被申明为文件范围内static的函数一样。有了命名空间后,文件范围内的static 已经不赞成使用了,你应该尽快让自己习惯使用无名的命名空间(只要编译器支持)。

2015-07-30 15:34:56 433

原创 读书笔记MoreEffectiveC++(30)

代理类1.通常,将一个对象做左值使用意味着它可能被修改,做右值用意味着它不能够被修改。2.最后,从一个处理实际对象的类改换到处理proxy 对象的类经常改变了类的语义,因为proxy 对象通常表现出的行为与实际对象有些微妙的区别。有时,这使得在设计系统时无法选择使用proxy 对象,但很多情况下很少有操作需要将proxy 对象暴露给用户

2015-07-30 10:13:11 339

原创 读书笔记MoreEffectiveC++(29)

1.引用计数将比通常的方法使用更多的内存和执行更多的代码。另一方面,如果你的对象确实有具体相同值的趋势,那么引用计数将同时节省时间和空间。共享的值所占内存越大,同时共享的对象数目越多,节省的内存也就越大

2015-07-30 01:01:09 372

原创 读书笔记MoreEffectiveC++(28)

灵巧(smart)指针1.如果我们只拷贝内部的dumb pointer,会导致两个auto_ptr 指向一个相同的对象。这是一个灾难,因为当释放quto_ptr 时每个auto_ptr 都会删除它们所指的对象。这意味着一个对象会被我们删除两次。这种两次删除的结果将是不可预测的2.auto_ptr只用于堆内存

2015-07-29 22:27:30 384

原创 读书笔记MoreEffectiveC++(26)

限制某个类所能产生的对象数量1.阻止建立某个类的对象,最容易的方法就是把该类的构造函数声明在类的private域2.这个设计由三个部分组成,第一、Printer 类的构造函数是private。这样能阻止建立对象。第二、全局函数thePrinter 被声明为类的友元,让thePrinter 避免私有构造函数引起的限制。最后thePrinter 包含一个静态Printer 对象,这意味着只有一

2015-07-29 09:27:17 481

原创 读书笔记MoreEffectiveC++(27)

要求或禁止在堆中产生对象1.通过限制访问一个类的析构函数或它的构造函数来阻止建立非堆对象,这种方法也禁止了继承和包容2.当在堆上分配对象时,会调用operator new 来分配raw memory”,operator new 设置onTheHeap为true,每个构造函数都会检测onTheHeap,看对象的raw memory 是否被operator new所分配

2015-07-29 09:26:33 401

原创 读书笔记MoreEffectiveC++(25)

将构造函数和非成员函数虚拟化1.构造函数不能真的成为虚拟函数一样,非成员函数也不能成为真正的虚拟函数2.具有虚拟行为的非成员函数很简单。你编写一个虚拟函数来完成工作,然后再写一个非虚拟函数,它什么也不做只是调用这个虚拟函数。为了避免这个句法花招引起函数调用开销,你当然可以内联这个非虚拟函数.

2015-07-29 09:23:46 347

原创 读书笔记MoreEffectiveC++(24)

理解虚拟函数、多继承、虚基类和RTTI 所需的代价1.一个vtbl 通常是一个函数指针数组。(一些编译器使用链表来代替数组,但是基本方法是一样的)在程序中的每个类只要声明了虚函数或继承了虚函数,它就有自己的vtbl,并且类中vtbl 的项目是指向虚函数实现体的指针。2.派生类会继承基类的虚函数3.你必须为每个包含虚函数的类的virtualtalbe 留出空间。类的vtbl 的大小与类中

2015-07-28 11:05:53 355

原创 读书笔记MoreEffectiveC++(23)

考虑变更程序库1.如果你的程序有I/O 瓶颈,你可以考虑用stdio 替代iostream,如果程序在动态分配和释放内存上使用了大量时间,你可以想想是否有其他的operator new 和 operator delete 的实现可用

2015-07-28 10:20:07 342

原创 读书笔记MoreEffectiveC++(22)

考虑用运算符的赋值形式(op=)取代其单独形式(op)1.就C++来说,operator+、operator=和operator+=之间没有任何关系,因此如果你想让这三个operator同时存在并具有你所期望的关系,就必须自己实现它们。2.、总的来说operator 的赋值形式比其单独形式效率更高,因为单独形式要返回一个新对象,从而在临时对象的构造和释放上有一些开销。operator 的赋

2015-07-28 10:08:40 330

原创 读书笔记MoreEffectiveC++(21)

通过重载避免隐式类型转换1.在C++中有一条规则是每一个重载的operator 必须带有一个用户定义类型(user-defined type)的参数。int 不是用户定义类型,所以我们不能重载operator 成为仅带有此[int]类型参数的函数。2.建立临时对象进行类型转换工作是有开销的,而我们不想承担这种开销

2015-07-28 09:50:47 236

原创 读书笔记MoreEffectiveC++(20)

协助完成返回值优化1.这种特殊的优化――通过使用函数的return 位置(或者在函数被调用位置用一个对象来替代)来消除局部临时对象――是众所周知的和被普遍实现的

2015-07-28 09:38:51 378

原创 读书笔记MoreEffectiveC++(19)

理解临时对象的来源1.,临时对象是有开销的,所以你应该尽可能地去除它们,然而更重要的是训练自己寻找可能建立临时对象的地方。在任何时候只要见到常量引用(reference-to-const)参数,就存在建立临时对象而绑定在参数上的可能性。在任何时候只要见到函数返回对象,就会有一个临时对象被建立(以后被释放)。学会寻找这些对象构造,你就能显著地增强透过编译器表面动作而看到其背后开销的能力。

2015-07-28 01:14:34 343

原创 读书笔记MoreEffectiveC++(18)

分期摊还期望的计算1.operate new开销很大,因为它将导致底层操作系统的调用,系统的调用速度比进程内函数调用的速度慢2.。Cache 运算结果需要更多的内存,但是一旦需要被缓存的结果时就能减少需要重新生成的时间。Prefetch 需要空间放置被prefetch 的东西,但是它减少了访问它们所需的时间。自从有了计算机就有这样的描述:你能以空间换时间。

2015-07-28 00:58:25 314

原创 读书笔记MoreEffectiveC++(17)

懒惰计算法1.:能避免不需要的对象拷贝,通过使用operator[]区分出读操作,避免不需要的数据库读取操作,避免不需要的数字操作。但是它并不总是有用。就好象如果你的父母总是来检查你的房间,那么拖延整理房间将不会减少你的工作量。实际上,如果你的计算都是重要的,lazy evaluation 可能会减慢速度并增加内存的使用,因为除了进行所有的计算以外,你还必须维护数据结构让lazy evalua

2015-07-28 00:19:10 323

原创 读书笔记MoreEffectiveC++(16)

牢记80-20 准则(80-20 rule)1.软件整体的性能取决于代码组成中的一小部分。

2015-07-27 10:57:59 319

原创 读书笔记MoreEffectiveC++(15)

了解异常处理的系统开销1.采用不支持异常的方法编译的程序一般比支持异常的程序运行速度更快所占空间也更小。2.为了减少开销,你应该避免使用无用的try 块。

2015-07-27 10:52:05 259

原创 读书笔记MoreEffectiveC++(14)

谨慎使用异常规格1.A 函数调用B 函数,但因为B 函数可能抛出一个不在A 函数异常规格之内的异常,所以这个函数调用就违反了A 函数的异常规格,编译器不对此种情况进行检测,并且语言标准也禁止编译器拒绝这种调用方式

2015-07-27 10:23:52 371

原创 读书笔记MoreEffectiveC++(13)

通过引用捕获异常1.是否应该删除他们接受的指针?如果是在堆中建立的异常对象,那他们必须删除他,否则会造成异常泄露。如果不是在堆中建立的对象,那绝不能删除它。所以最好避免传指针给异常2.通过值捕获异常,会遇到slicing problem,触发多态时,派生类对象依旧用基类来析构3.通过引用没有上述两个问题,而且异常对象只被拷贝一次。

2015-07-27 09:42:33 231

原创 读书笔记MoreEffectiveC++(12)

理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异1.异常传递的途径可以是传值,引用或指针。当你调用函数时,程序的控制权最终还会返回到函数的调用处,但是,当你抛出一个异常时,控制权永远不会回到抛出异常的地方。2.不论传值捕获异常还是引用捕获异常,都会进行对参数进行拷贝操作,异常处理的是一个副本。都是先拷贝临时对象,再把临时对象拷贝到参数中,拷贝了两次。3.抛出异常运行速

2015-07-27 01:15:51 257

原创 读书笔记MoreEffectiveC++(11)

禁止异常信息传递到析构函数外1.在两种情况下会调用析构函数。第一种是在正常情况下删除一个对象,例如对象超出了作用域或被显示的delete。第二种是异常传递的堆栈辗转开解过程中,由异常系统删除一个对象

2015-07-27 00:15:41 274

原创 Triangle

class Solution {public: int minimumTotal(vector>& triangle) { if(triangle.empty()) { return 0; } int len = triangle.size(); vector tmp(

2015-07-25 11:55:27 362

原创 Unique Binary Search Trees II

比根节点值小的数都可以做左子树的结点class Solution {public: void generate(vector& vec, int start, int end) { if(start > end) { vec.push_back(NULL); return; }

2015-07-24 19:54:17 237

原创 读书笔记MoreEffectiveC++(10)

在constructors内阻止资源泄露1.面对尚未完全构造好的对象,c++拒绝调用其destructors2.当对象在构造时,抛出异常会造成,对象构造不完整,但又没法将其释放的尴尬境地,面对这种情形可以使用auto_ptr作为成员指针

2015-07-23 19:55:36 285

原创 读书笔记MoreEffectiveC++(9)

利用destructors避免泄露资源1.当程序抛出异常时,heap 资源可能没回收,程序就已经结束,造成了内存的泄漏。解决方法是把资源放在对象中,利用对象的析构函数在程序结束时都会被调用,回收可能会被泄露的资源,c++提供的auto_ptr 利用的就是这个原理

2015-07-23 19:03:35 317

原创 读书笔记MoreEffectiveC++(8)

了解各种不同意义的new和delete1.new 做两件事,第一,分配内存。第二,调用constructor为刚分配的内存设定初值。而operator new 来完成第一步操作,返回一个void*指针,指向一块未被赋初值的内存。类比于malloc2.placement new 是operator的一个特殊版本,除了size_t自变量外,还接受了一个void*参数指向内存,用来接收构造好的对

2015-07-23 18:27:44 312

原创 读书笔记MoreEffectiveC++(7)

千万不要重载&&,||和,操作符1.你不能重载 .  .*  ::  ?:  new  delete  sizeof  typeid  static_cast  dynamic_cast  const_cast  reinterpret_cast2.你能重载

2015-07-23 16:05:21 302

原创 读书笔记MoreEffectiveC++(6)

区别increment/decrement操作符的前置(prefix)和后置(postfix)形式1.定义后置形式时,要让他有一个int变量,主要是为了与前置区分开来2.前置形式要返回一个引用,而后置形式要返回const对象,编译器不支持连续两次调用后置,因为会造成混淆,i++++行为是被编译器禁止的3.设计classes的一条无上宝典是:一旦有疑虑,试看ints行为如何并遵循之

2015-07-23 15:46:50 323

原创 读书笔记MoreEffectiveC++(五)

不要提供类型转换函数1.两种函数允许编译器执行隐式类型转换,单自变量constructors和隐式类型转换函数操作符1单自变量constructors是指能够一个单一自变量成功调用constructors,声明时可以是一个参数,也可能声明拥有多个参数,并且除了第一参数之外都有默认值。解决方法是定义类时加上explicit关键词。如果编译器不提供这个关键词,可以使用proxy classes

2015-07-23 15:19:45 345

原创 读书笔记MoreEffectiveC++(四)

非必要不提供default constructor1.如果要使用对象数组,建议提供2.如果要使用template-based container classes,建议提供3.如果要使用virtual base classes,建议提供4.如果提供default constructor,会造成判断对象是否已被初始化的麻烦时,建议不提供,否则会影响class效率

2015-07-23 10:59:15 392

原创 读书笔记MoreEffectiveC++(三)

绝对不要以多态的方式处理数组1.基类指针或引用可以调用派生类对象,array[i]是一个指针算数表达式,array是一个基类指针,但却是一个含有派生类对象的数组,当遍历数组数组元素时,指针的步长是基类对象的size,会造成意想不到的错误。2.base class指针删除 derived classes objects构成的数组,其结果未定义。都是步长惹的祸。:)

2015-07-23 10:27:01 404

原创 读书笔记MoreEffectiveC++(二)

尽量使用C++风格的类型转换1.static_cast(expression)大部分功能等价于C风格的(type)expression,但是不能像C分格的类型转换把struct转换成int,或者把double转换成指针类型,也不能去除const属性2.const_cast用来转换掉表达式的const或volatileness属性,但是除此之外的类型转换将会被编译器拒绝3.dynamic

2015-07-23 01:05:58 357

原创 读书笔记MoreEffectiveC++(一)

指针与引用的区别1.指针可以赋为NULL,而引用不能为空值,引用在定义时必须初始化2.指针的值可以改变,而引用只能用在一个对象上,引用始终指的是一个对象3.当你重载某个操作符时,应当使用引用,例:

2015-07-23 00:08:13 434

原创 几种排序的源代码

void bubble_sort(int* a,int len){ int up=0; int down=len-1; int i,temp; while(up<down) { for(i=up+1;i<down;i++) { if(a[i-1]>a[i]) { temp=a[i-1]; a[i-1]=a[i]; a[i]=temp;

2015-07-21 22:25:39 661

原创 openmesh中常用的几个文件夹

1.OpenMesh-3.3/build/Build/bin$  在这里有程序的执行文件2.OpenMesh-3.3/build 在这里make3.OpenMesh-3.3/src/OpenMesh/Apps$ 在这里写程序

2015-07-21 18:03:12 894

原创 Unique Paths II

Follow up for "Unique Paths":Now consider if some obstacles are added to the grids. How many unique paths would there be?An obstacle and empty space is marked as 1 and 0 respectively in the

2015-07-18 14:36:39 264

空空如也

空空如也

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

TA关注的人

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