首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

more-effective-c++ 序列一 new和delete的测试

2013-03-17 
more-effective-c++ 序列1 new和delete的测试more-effective-c 序列1 new和delete的测试1,在堆内存中分配

more-effective-c++ 序列1 new和delete的测试
more-effective-c++ 序列1 new和delete的测试
1,在堆内存中分配对象,而且欲对堆内存的分配使用自己的方式。Widget *pWidget = new Widget():
1,调用operator new 分配内存
2,将内存上的对象调用构造函数
3,转换为Widget*赋值给pWidget
故而可以通过重写operator new 和delete来自己决定内存分配方式。


下面的代码在operator new中调用的malloc,在operator delete 调用的free。
当然你甚至可以使用内存池的观点,operator new调用GetMemory, operator delete调用ReturnMemory.
这样可以个性化自己的内存分配方式。

#include <iostream>#include <time.h>using namespace std;/*new operator会调用operator new和Widget的构造函数重载operator new和delete实现placement new*/#define TRACE_FUCTION_AND_LINE(fmt, ...) printf("[%20s:%4d]"fmt"\n",__FUNCTION__, __LINE__, ##__VA_ARGS__)class Widget{public:Widget(int nHight = 0): m_nHight(nHight) {TRACE_FUCTION_AND_LINE();}void* operator new(size_t nSize, void* buffer){TRACE_FUCTION_AND_LINE("malloc p=%08p", buffer);return buffer;}~Widget(){TRACE_FUCTION_AND_LINE();}void Log () {TRACE_FUCTION_AND_LINE("My Log------%d", m_nHight);}int m_nHight;};int main(){char buf[sizeof(Widget)]; //分配栈内存void* memory = buf;//分配widget内存,实际上使用的是栈内存TRACE_FUCTION_AND_LINE("memory = %08p", memory);Widget* pw = new (memory)Widget(100); //placement new 将memory指针传递到operator newpw->Log();pw->~Widget();//主动调用析构函数/*double start, end;while(1){start = clock();for(int i = 0; i < 500; ++i){for(int j = 0; j < 10000; ++j){void* pMemory = operator new(10000);operator delete(pMemory);}}end = clock();TRACE_FUCTION_AND_LINE("operator new takes %.2f seconds", (end-start) / CLOCKS_PER_SEC);start = clock();for(int i = 0; i < 500; ++i){for(int j = 0; j < 10000; ++j){void* pMemory = new char[10000];delete [](pMemory);}}end = clock();TRACE_FUCTION_AND_LINE("new char takes %.2f seconds", (end-start) / CLOCKS_PER_SEC);start = clock();for(int i = 0; i < 500; ++i){for(int j = 0; j < 10000; ++j){void* pMemory = malloc(10000);free(pMemory);}}end = clock();TRACE_FUCTION_AND_LINE("malloc takes %.2f seconds", (end-start) / CLOCKS_PER_SEC);TRACE_FUCTION_AND_LINE("\n\n\n");}*/return 0;}


热点排行