为C++标准库容器写自己的内存分配程序
作者 佚名技术
来源 程序设计
浏览
发布时间 2012-06-30
freelist_index(sizeof(T)); if(index >= NODENUMS) { return NULL; } my_free_list = pHead->uFreelist + index; //Lock(semid,LOCK_NUM); result = *my_free_list; if (result == 0) { ret = (pointer)refill((int)num, round_up(sizeof(T))); } else { *my_free_list = result->M_free_list_link; ret = (pointer)result; } //UnLock(semid,LOCK_NUM); pHead->iUseNum[index] = pHead->iUseNum[index] + (int)num; if(0 == ret) { std::cerr << "alloc memory fail!" << std::endl; exit(1); } std::cerr << " allocated at: " << (void*)ret << std::endl; PrintFreelistAndCookie(); return ret; } void construct (pointer p, const T& value) { // initialize memory with placement new new((void*)p)T(value); } void destroy (pointer p) { // destroy objects by calling their destructor p->~T(); } void deallocate (pointer p, size_type num) { Obj** my_free_list; Obj* q ; int index; index = freelist_getindex(sizeof(T)); if(index >= NODENUMS) { std::cerr << "deallocate memory fail!" << std::endl; exit(1); } my_free_list = pHead->uFreelist + index; q = (Obj*) p; //Lock(semid,LOCK_NUM); /*这个地方可能会有问题*/ //for(int i=0 ;i<(int)num ; i++) { q->M_free_list_link = *my_free_list; *my_free_list = q; } //UnLock(semid,LOCK_NUM); pHead->iUseNum[index] = pHead->iUseNum[index] - (int)num; std::cerr << "deallocate " << num << " element(s)" << " of size " << sizeof(T) << " at: " << (void*)p << std::endl; PrintFreelistAndCookie(); } }; template <class T> int MyAlloc<T>::round_up(int bytes) { int i; i = bytes; if(bytes < ALIGN) { i = ALIGN; } std::cout<<"round_up:bytes="<<bytes<<" , return="<<i<<std::endl; return i; }; template <class T> int MyAlloc<T>::freelist_index(int bytes) { int i; for(i=0 ; i< NODENUMS ; i++) { if(pHead->sFreelistIndex[i] == bytes) break; } if(i >= NODENUMS) { for(i=0 ; i< NODENUMS ; i++) { if(pHead->sFreelistIndex[i] == 0) { pHead->sFreelistIndex[i] = bytes; std::cout<<"freelist_index:bytes="<<bytes<<" , return="<<i<<std::endl; return i; } } } std::cout<<"freelist_index:bytes="<<bytes<<" , return="<<i<<std::endl; return i; }; template <class T> int MyAlloc<T>::freelist_getindex(int bytes) { int i; for(i=0 ; i< NODENUMS ; i |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 如何成为一名C++程序员下一篇: C++箴言:理解inline化的介入和排除
关于为C++标准库容器写自己的内存分配程序的所有评论