effective C++笔记之条款9、10:避免隐藏标准形式的new、如果写了operator new 就要同时写operator delete
2012-03-08 14:37
288 查看
条款9: 避免隐藏标准形式的new
l 当在类里增加了一个带多个参数的operator new函数。可能会调用不到全局(标准)的new,这时就会出错。
l 两个办法:在类里写一个支持标准形式的operator new,它和标准new做同样的事。可用一个高效的内联函数来封装实现;为每一个增加到operator new的参数提供缺省值。
l 无论用哪种方法,如果以后想对“标准形式”的new制定新的功能,只需要重写这个函数。调用者编译链接后就可以使用新功能了。
条款 10:如果写了operator new 就要同时写operator delete
l 写自己的operator new和 operator delete是为了效率。在那些需要动态分配大量的但很小的对象的应用程序里,情况更是如此。
l 当调用operator new来分配一个类对象时,得到的内存可能会更大一些。因为operator new和operator delete之间要互相传递信息。operator delete想要知道释放的内存有多大,就必须知道当初operator new分配的内存有多大。一种常用的方法是让operator new告诉operator delete当初分配的内存大小是多少。这样做很奢侈。
l 如果为类专门写一个operator new,就可以利用每个类对象的大小相等的特点,不必在每个分配的内存块上附带信息了。里面的::operator new调用分配内存失败,会调用new-heandler函数,不需要在类的operator new中处理,隐藏在::operator new中。
l 对于大量的小对象动态分配的情况,可以考虑使用内存池。::operator new返回的内存块是从来没有被释放。但内存池和内存泄漏有一个重要的不同之处。内存泄漏会无限地增长,即使客户循规蹈矩;而内存池的大小绝对不会超过客户请求内存的最大值。
l 自定义的内存管理程序可以很好的改善程序的性能,而且可以封装在象Pool这样的类里。但operator new 和 operator delete需要同时工作,写了operator new,就要写operator delete。
l 当在类里增加了一个带多个参数的operator new函数。可能会调用不到全局(标准)的new,这时就会出错。
l 两个办法:在类里写一个支持标准形式的operator new,它和标准new做同样的事。可用一个高效的内联函数来封装实现;为每一个增加到operator new的参数提供缺省值。
l 无论用哪种方法,如果以后想对“标准形式”的new制定新的功能,只需要重写这个函数。调用者编译链接后就可以使用新功能了。
条款 10:如果写了operator new 就要同时写operator delete
l 写自己的operator new和 operator delete是为了效率。在那些需要动态分配大量的但很小的对象的应用程序里,情况更是如此。
l 当调用operator new来分配一个类对象时,得到的内存可能会更大一些。因为operator new和operator delete之间要互相传递信息。operator delete想要知道释放的内存有多大,就必须知道当初operator new分配的内存有多大。一种常用的方法是让operator new告诉operator delete当初分配的内存大小是多少。这样做很奢侈。
l 如果为类专门写一个operator new,就可以利用每个类对象的大小相等的特点,不必在每个分配的内存块上附带信息了。里面的::operator new调用分配内存失败,会调用new-heandler函数,不需要在类的operator new中处理,隐藏在::operator new中。
l 对于大量的小对象动态分配的情况,可以考虑使用内存池。::operator new返回的内存块是从来没有被释放。但内存池和内存泄漏有一个重要的不同之处。内存泄漏会无限地增长,即使客户循规蹈矩;而内存池的大小绝对不会超过客户请求内存的最大值。
l 自定义的内存管理程序可以很好的改善程序的性能,而且可以封装在象Pool这样的类里。但operator new 和 operator delete需要同时工作,写了operator new,就要写operator delete。
相关文章推荐
- 条款10: 如果写了operator new就要同时写operator delete (转自effective c++ second edition)
- Effective C++ 第二版 8) 写operator new 和operator delete 9) 避免隐藏标准形式的new
- Effective C++ 第二版 8) 写operator new 和operator delete 9) 避免隐藏标准形式的new
- 条款10: 如果写了operator new就要同时写operator delete
- 条款9:避免隐藏标准形式的new
- 条款九: 避免隐藏标准形式的new
- 条款十: 如果写了operator new就要同时写operator delete
- Effective C++:条款9: 避免隐藏标准形式的new
- effective C++笔记之条款27:如果不想使用隐式生成的函数就要显示地禁止它
- effective C++笔记之条款8: 写operator new和 operator delete 时要遵循常规
- effective C++笔记之条款5:对应的new和delete要采用相同的形式
- Effective C++——》条款16:成对使用new和delete时要采取相同的形式
- operator new之避免覆盖标准形式的new/delete的“模板”类
- Effective C++学习笔记:对应的new和delete要采用相同的形式
- Item 16:为什么要使用同样的形式来new和delete Effective C++笔记
- effective C++笔记之条款31、32: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针所指对象的引用、尽可能地推迟变量的定义
- Effective C++条款16:成对使用new和delete时要采取相同形式
- Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式
- effective C++笔记之条款39: 避免“向下转换”继承层次
- 读书笔记_Effective_C++_条款十六:成对使用new和delete时要采取相同的形式