注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

VC的STL到底有没有使用内存池?  

2014-07-14 11:35:51|  分类: 定期查阅 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        为了更好地验证,这里以VC2013为分析对象。

        VC的STL库版本为P.J STL,对于其有没有使用内存池,网上的说法不一,一说 自VC2010开始,其自带的STL开始使用内存池,但是看了其理由,我将信将疑。

        1. vector的内存池说法

         因为vector是连续内存区域,所以当前的内存不足以容纳时,会重新分配内存块,所以这个可以认为是内存池,也可以认为不是,无关紧要。显然,这部分内存在vector析构时是会回收的。关于这一点,我已经跟踪过。

          关于capacity size。网上存在一种说法,即,vector在插入元素导致需要扩充容量时,会保留之前的内存分配,比如1,2,4,8,16,依次保存下去,进而导致内存耗尽。这一点我也跟踪过,对于VC的STL,并非如此,它在每次分配新的内存之后,会deallocate旧的内存块。至于其他STL版本,我相信也不太可能如此,因为这样的做法有点愚蠢,也是非常浪费内存资源的。

          我在早期接触stl时,曾经在linux系统下面犯了这样的错误,多线程中对vector进行访问,并且没加锁,对vector进行插入操作后,旧的内存地址无法访问了!这个错误很低级,但在这里,间接验证了一个观点:linux下面的g++所带的stl库也不是他人所说的,保留vector的历史内存分配的块,否则至少程序不应该崩溃吧(访问无效内存区域)。

         2. map、set有没有使用内存池

         我的分析结果是没有。VC2013的STL allocator代码在文件:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0。这个文件的代码不多,但是是没有内存池的相关代码或者调用的。

 

By:zhanyonhu

  评论这张
 
阅读(560)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016