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

内存池的大小怎么设定

2013-01-11 
内存池的大小如何设定啊还有就是弱弱地问一句,stl中capicity-size那部分算不算内部内存碎片啊?内存池看了

内存池的大小如何设定啊
还有就是弱弱地问一句,stl中capicity-size那部分算不算内部内存碎片啊?

内存池看了些资料,有些晕,感觉方法有很多种,也下载了些源码,感觉有点长,不是很懂,我想问内存池的大小如何给定,是new一块大的连续区域,然后用队列或者栈的方式分配这块区域吗?
不知道我的理解对不对,希望各位解答,不胜感激。
[解决办法]
内存池就是每次分配固定大小的内存,我们叫做block,比如一个block 2M。然后就往这些内存里放内容,这个好处就是避免了小对象频繁的new和delete,既影响效率又会导致内存碎片,降低内存的使用效率。
[解决办法]
分配一块内存区域以后可以用静态链表管理
[解决办法]
>stl中capicity-size那部分算不算内部内存碎片啊?
那些东西跟内存碎片没有直接的关系
所谓的内存碎片是这样的
假设你有32Byte的记忆体
你现在分配了5次记忆体(20byte)

//*************************//
  aaaabbbbccddee(12byte)
//*************************//

现在你回收了前4笔记忆体(14byte)
//*************************//
      (14byte)ee(12byte)
//*************************//

aaaabbbbccdd占用了14byte
ee占用了6byte
接下来你要分配的是16byte的记忆体
oh,很抱歉,你的空间不足了
虽然14byte + 12 byte = 26bytes
但是你却无法分配到16byte的空间
这就是memory fragmentation

如果你的os支援virtual memory,这种情况就没有这么严重

physical memory的配置
//*************************//
  ffffffffddff(10byte)
//*************************//

virtual memory的配置
//*************************//
  fffffffffffee(10byte)
//*************************//

这就是memory fragmentation

memory pool的设计就请其他人补上吧
[解决办法]

引用:
希望各位给我讲讲你们的内存池实现,谢谢
modern C++里面有个很好的例子,你可以研究下
[解决办法]
引用:
希望各位给我讲讲你们的内存池实现,谢谢


这个针对不同的需求 会有不同的实现方式

我们有的内存池 是有分配粒度 和 最大分配粒度 的这样两个属性
比如 分配粒度是256字节(这个是一个block) 最大分配粒度4K
初始化的时候是由一个双向链表管理这些block
逻辑申请1000字节大小的内存 计算下1000需要由4个block组成
然后就从空闲队列里面分配连续的4个256字节给上层逻辑

针对业务逻辑的不同的模块 分配粒度是不一样的

热点排行