小对象的分配技术(3/4)
来源:互联网 发布:淘宝店店铺介绍在哪写 编辑:程序博客网 时间:2024/04/27 17:02
3.SmallObjAllocator
如果第一次看到小型对象的分配细节,看完Chunk和FixedAllocator之后你一定很迷茫,在内存分配的起初两层,我们总是在研究固定大小的内存块,这似乎没有一点用处,大小一旦确定,你无法分配比blockSize大的内存块,即使是 blockSize得整数倍,因为一次只得到了一块内存,连续两次得到的内存块未必是连续的,你也不适合分配比blockSize小的内存块,这要浪费内存,而且很别扭。其实这都是因为Loki小对象分配器把Chunk和FixedAllocator做为原组使用了,真正分配任意大小内存的是SmallObjAllocator,看一下代码你就肯定明白了:
...{
public:
SmallObjAllocator(std::size_t chunkSize,std::size_t maxObjectSize);
void* Allocate(std::size_t numBytes);
void Deallocate(void* p,std::size_t size);
private:
std::vector<FixedAllocator> pool_;
};
我们在构造函数里确定最大可分配的内存块大小,但是这并不意味着你只能分配不比maxObjectSize大的内存块,只是对于这样的内存块SmallObjAllocator转发给了系统的new。
我们已经知道,FixedAllocator只能分配固定大小的内存块,是的,到这里你明白了,pool_里有所有大小的Chunk,如此任意大小的块分配都可以转给合适的Chunk。在Deallocate里我们要求提供一个内存块大小的参数,避免pool_级别的遍历。
为了避免可能的内存浪费,pool_里的FixedAllocator并不是从1到maxObjectSize全部一次性分配的,一般情况下,一次性分配对内存的浪费是惊人的,相反,我们采用首次使用分配的策略。在首次使用的时候分配,依FixedAllocator里使用到的策略,我们对最后使用到的FixedAllocator记录以优化查询,最差情况下,SmallObjAllocator进行二分查找。
...{
public:
...
private:
std::vector<FixedAllocator> pool_;
FixedAllocator* pLastAlloc_;
FixedAllocator* pLastDealloc_;
};
- 小对象的分配技术(3/4)
- 小对象的分配技术(结)
- 小对象的分配技术(4/4)
- 小对象的分配技术(1/4)
- 小对象的分配技术(2/4)
- 关于JVM对象分配的小实验
- 小型对象分配技术
- 类对象的内存分配(一)
- java对象的分配
- 一个小的分配问题
- 内存分配(4)–LOKI的小物件分配器
- Unity3D对象池技术(ObjectPool)小例子
- 对象的动态内存分配
- 面向对象的内存分配
- c++对象内存的分配
- c++对象内存的分配
- c++对象内存的分配
- c++对象内存的分配
- 在RFID射频识别系统中的天线问题
- 再谈 State 模式
- GridView使用技巧之:新增记录、GridView内数据验证、删除信息提示等
- Hibernate的检索策略小结
- ASP.NET大结果集的分页
- 小对象的分配技术(3/4)
- JSP培训(4)——实例:登录功能、jsp:forward标签、jsp:include标签、include指令、EL、c:if
- 关于使用PRO*C编程的一些简单说明和例子
- 卸载HTTPSERVER 和 WEBSERVER
- VC生成.DLL在.NET中的使用问题
- asp.net中Request对象 技术浅析
- 有关乱码的处理---中国程序员永远无法避免的话题
- 不打开文件遍历块
- HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署即可!