上次提到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(最近使用緩存模板)。