A Custom Block Allocator for Speeding Up VC++ STL
来源:互联网 发布:历年大学生就业率数据 编辑:程序博客网 时间:2024/04/29 16:13
- Download source files - 6.1 KB
Introduction
block_allocator
is a custom STL allocator for use with STL as implemented in Microsoft VC++. Rather than doing allocations on a per-node basis, block_allocator
allocates memory in fixed sized chunks, and delivers portions of these chunks as requested. Typical speed improvements of 40% have been obtained with respect to the default allocator. The size of the chunks, set by the user, should not be too little (reduced speed improvements) nor too large (memory wasted). Experiment and see what sizes fit best to your application.
block_allocator
can substitute for the default allocator in the following containers:
list
,set
,multiset
,map
,multimap
,
and WON'T work with other containers such as vector
or queue
. Note however that vector
and queue
already perform allocation in chunks. The usage of block_allocator
is fairly simple, for instance:
Collapse Copy Code
// block allocated list of ints with chunks of 1024 elementsstd::list > l;
Normal containers and block allocated containers can coexist without problems.
Compatibility mode with MSVC++ 6.0/7.0
Due to limitations of the standard library provided with these compilers, the mode of usage explained above does not work here. To circumvent this problem one must proceed as follows: For each of the containers supported, there's an associated block allocated container derived from it thru use of block_allocator
. You have to define an activating macro for each container to be defined prior to the inclusion of blockallocator.h:
list -> block_allocated_list
(macroDEFINE_BLOCK_ALLOCATED_LIST
),set -> block_allocated_set
(macroDEFINE_BLOCK_ALLOCATED_SET
),multiset -> block_allocated_multiset
(macroDEFINE_BLOCK_ALLOCATED_MULTISET
),map -> block_allocated_map
(macroDEFINE_BLOCK_ALLOCATED_MAP
),multimap -> block_allocated_multimap
(macroDEFINE_BLOCK_ALLOCATED_MULTIMAP
),
To use block allocation based STL in your application, define the corresponding activating macro, include blockallocator.h and then change your declarations as follows:
list -> block_allocated_list
set -> block_allocated_set
multiset -> block_allocated_multiset
map -> block_allocated_map
multimap -> block_allocated_multimap
where chunk_size
is the size of the chunks. You can enter too the other optional template parameters (see MSVC++ STL docs for more info).
The MSVC++ 6.0/7.0 compatibility mode can also be used in MSVC++ 7.1, so you need not modify your block_allocator
-related code when porting legacy code to 7.1.
Multithreading issues
Each block allocated container instance uses its own block_allocator
, so no multithreading problems should arise as long as your program conveniently protects their containers for concurrent access (or if no two threads access the same container instance). This is the same scenario posed by regular STL classes (remember operations on containers are not guarded by CRITICAL_SECTION
s or anything similar), so the moral of it all is: If your program was multithread safe without block_allocator
, it'll continue to be with it.
Version history
- 29th Feb, 2000 - 1.1
- Initial release in CodeProject.
- 22nd Mar, 2001 - 1.2
- Included definitions for
operator==
andoperator!=
. The lack of these caused linking errors when invokinglist::swap()
and similar methods. The funny thing about it is that no one ever reported this seemingly important bug, so eitherswap()
is not that much used or not that many people useblock_allocator
!
- Included definitions for
- 25th Oct, 2006 - 1.3
block_allocator
now works with MSVC++ 7.1 and 8.0. Thanks to James May for helping with testing this new version of the code.
- 30th Oct, 2006 - 1.4
- Fixed some
typedef
s incorrectly madeprivate
inblock_allocated_list
,block_allocated_set
, etc.
- Fixed some
License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
About the Author
Joaquín M López Muñoz
Member
- A Custom Block Allocator for Speeding Up VC++ STL
- A Custom Block Allocator for Speeding Up VC++ STL
- 10 tips for speeding up Outlook
- Best Practices for Speeding Up Your Web Site
- Exceptional Performance : Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- [转]Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- Best Practices for Speeding Up Your Web Site
- 云计算、开源
- 出现Directory Listing Denied的原因和解决方法
- SSH2 + XFire
- 谁能教教我做一个界面?
- 失声还是失贞——北塔利与欲的博弈(转)
- A Custom Block Allocator for Speeding Up VC++ STL
- oracle10G r2中oracle提供了企业用户代理 user agent
- 灵魂游戏服务器的设计方案
- WinForms和XNA
- 失声还是失贞——北塔利与欲的博弈(转)
- oracle 事务处理 commit rollback
- DataTable添加列和行NEW
- birt 报表在tomcat下的工具条怎么汉化
- tab in android