博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MemPool
阅读量:6242 次
发布时间:2019-06-22

本文共 1302 字,大约阅读时间需要 4 分钟。

腾讯笔试题,设计内存池,alloc和free都是O(1)。

和LRUCache类似,这里用了一个list表示可用的空间,用一个map来记录这块内存是否已分配,这样free的时候才可能O(1)。

1 class MemPool { 2     public: 3         void init(int unitSize, int maxUnitNum) { 4             long long size = unitSize * maxUnitNum; 5             buffer = new char[size]; 6             memset(buffer, 0, sizeof(char) * size); 7             for (int i = 0; i < size; ++i) { 8                 available.push_back(buffer + i); 9             }10         }11 12         ~MemPool() {13             if (buffer) {14                 delete[] buffer;15             }16         }17         // O(1)18         void* alloc() {19             if (available.empty()) return NULL;20             char* ans = available.front();21             available.pop_front();22             allocated[ans] = 1;23             return ans;24         }25 26         // O(1)27         void free(void *pUnit) {28             char* tmp = (char*)pUnit;29             if (allocated.find(tmp) == allocated.end()30                     || allocated[tmp] == 0) return;31             available.push_back(tmp);32             allocated[tmp] = 0;33         }34     private:35         unordered_map
allocated;36 list
available;37 char* buffer;38 };

 

转载于:https://www.cnblogs.com/linyx/p/3986823.html

你可能感兴趣的文章
[LeetCode] Sum Root to Leaf Numbers
查看>>
IO设计模式:Reactor和Proactor对比
查看>>
Qt Widgets——动作类与小部件菜单项
查看>>
ASP.NET MVC搭建项目后台UI框架—5、Demo演示Controller和View的交互
查看>>
[转]动态规划解最长公共子序列问题
查看>>
WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore...
查看>>
ORA-00600: 内部错误代码, 参数: [kqlnrc_1]
查看>>
Android Studio常用小技巧
查看>>
和为S的两个数字
查看>>
NPOI导出模板样式
查看>>
jsp请求由servlet响应的方式
查看>>
16 款最流行的 JavaScript 框架
查看>>
使用awrextr.sql导出awr原始数据
查看>>
分享一次失败的项目实践经验
查看>>
jedispool 连 redis
查看>>
PadLeft 补零
查看>>
注意了,99%通过天天特价的技巧!
查看>>
iOS H5容器的一些探究(一):UIWebView和WKWebView的比较和选择
查看>>
activity启动模式
查看>>
如何将页面设置为微信端才能打开
查看>>