上次提到Chromium浏览器中base公共通用库中的内存分配器allocator,其中用到了三方库tcmalloc、jemalloc;对于这两个内存分配器,个人建议,对于内存,最好是自己维护内存池;此外在windows下使用可使用其自带的内存分配方式;具体的第三方库可以参阅:http://www.360doc.com/content/13/0915/09/8363527_314549128.shtml;目前我们主要的精力尽可能在Chromium浏览器中base公共通用库的主要内容上,所以不再详细对那两个第三方内存分配库进行分析、研究,可留待以后研究;以下针对base下的allocator中的allocator.vcxproj讨论。
首先,该项目中主要包括三个文件:allocator.gyp、allocator_shim.h、allocator_shim.cpp;
allocator.gyp:一个用以构建和编译当前工程的文件;具体GYP构建工具可以查阅相关资料;我们将重点关注另外两个文件。
allocator_shim.h:SetupSubprocessAllocator安装子进程内存分配器,从环境中取字符串,获取环境变量的值,用以设置、转换指定的分配器并设置会环境中,其默认值为TCMALLOC,可修改;TCMallocDoMallocForTest,ExcludeSpaceForMarkForTest,ExcludeSpaceForMarkForTest主要用来暴露一些操作tcmalloc相关函数,测试用的。
allocator_shim.cpp:主要定义了分配器装换宏、分配器类型枚举:TCMALLOC、JEMALLOC、WINHEAP、WINLFH;其中前两个为第三方库分配器,后两个为windows下的分配器;WINHEAP为微软默认的标准分配器;WINLFH为低碎片堆分配器,详情可见:http://www.cnblogs.com/whyandinside/archive/2010/06/30/1768348.html或其他相关资料;另外对常见的malloc、free、realloc、_aligned_malloc、_aligned_free、_msize、运行时堆初始化_heap_init被重新定义,根据分配器类型,调用相应的分配器分配、释放、重分配策略;
此外allocator下的工程libcmt中,仅包含allocator.gyp和prep_libc.py,其中allocator.gyp已作介绍,prep_libc用以在生产目标文件了以后,连接前移除系统自带的那些操作内存分配的接口如:malloc、free、realloc、new、delete、new2等,使得当用户在其他工程使用该生成的库libcmt.lib时,使用的是该库提供的接口、分配策略(具体操作细节尚且不太明确,请见谅)。
allocator工程中还包括分配器测试工程、tcmalloc分配测试工程以及分配器扩展工程等,此处不再详细叙述。下一节将学习base公共通用库的containers,堆栈、列表、集合、以及Most Recently Used cache(最近使用缓存模板)。