Click here to Skip to main content
Click here to Skip to main content

A Custom Block Allocator for Speeding Up VC++ STL

By , 30 Oct 2006
 

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:
// block allocated list of ints with chunks of 1024 elements
std::list<int,block_allocator<int,1024> > 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 (macro DEFINE_BLOCK_ALLOCATED_LIST),
  • set -> block_allocated_set (macro DEFINE_BLOCK_ALLOCATED_SET),
  • multiset -> block_allocated_multiset (macro DEFINE_BLOCK_ALLOCATED_MULTISET),
  • map -> block_allocated_map (macro DEFINE_BLOCK_ALLOCATED_MAP),
  • multimap -> block_allocated_multimap (macro DEFINE_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<type> -> block_allocated_list<type,chunk_size>
  • set<key> -> block_allocated_set<key,chunk_size>
  • multiset<key> -> block_allocated_multiset<key,chunk_size>
  • map<key,type> -> block_allocated_map<key,type,chunk_size>
  • multimap<key,type> -> block_allocated_multimap<key,type,chunk_size>

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_SECTIONs 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== and operator!=. The lack of these caused linking errors when invoking list::swap() and similar methods. The funny thing about it is that no one ever reported this seemingly important bug, so either swap() is not that much used or not that many people use block_allocator!
  • 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 typedefs incorrectly made private in block_allocated_list, block_allocated_set, etc.

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
Spain Spain
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Questioncould it work well with vc2008??memberdoityth77717 Sep '11 - 6:03 
AnswerRe: could it work well with vc2008??memberJoaquín M López Muñoz18 Sep '11 - 20:55 
QuestionIs it possible for a custom memory allocator to affect the Windows API MapViewOfFile? [modified]memberMember 80890191 Aug '11 - 2:51 
AnswerRe: Is it possible for a custom memory allocator to affect the Windows API MapViewOfFile?memberJoaquín M López Muñoz1 Aug '11 - 19:48 
QuestionRe: Is it possible for a custom memory allocator to affect the Windows API MapViewOfFile?memberMember 80890194 Aug '11 - 20:31 
Questionblock_allocated_list::sort() 2x slower than a standard stl::list()?memberPet12326 May '08 - 20:33 
AnswerRe: block_allocated_list::sort() 2x slower than a standard stl::list()?memberJoaquín M López Muñoz27 May '08 - 22:45 
GeneralLow Fragmentation HeapmemberPaul Sanders (AlpineSoft)26 Oct '07 - 8:00 
GeneralFree Heap block 347970 modified at 348394 after it was freedmemberNyarlatotep19 Dec '06 - 7:33 
GeneralRe: Free Heap block 347970 modified at 348394 after it was freedmemberNyarlatotep19 Dec '06 - 7:46 
GeneralRe: Free Heap block 347970 modified at 348394 after it was freedmemberNyarlatotep19 Dec '06 - 8:26 
GeneralRe: Free Heap block 347970 modified at 348394 after it was freedmemberJoaquín M López Muñoz20 Dec '06 - 2:29 
GeneralRe: Free Heap block 347970 modified at 348394 after it was freedmemberNyarlatotep20 Dec '06 - 3:04 
GeneralExcellent! and weird effectmemberpeterchen14 Nov '06 - 9:20 
GeneralRe: Excellent! and weird effectmemberJoaquín M López Muñoz14 Nov '06 - 10:35 
GeneralRe: Excellent! and weird effectmemberpeterchen14 Nov '06 - 11:49 
GeneralProblem with block_allocated_list::const_iterator in VS2005memberWocki26 Oct '06 - 20:41 
AnswerRe: Problem with block_allocated_list::const_iterator in VS2005memberJoaquín M López Muñoz26 Oct '06 - 21:46 
Generalthank you!memberwb26 Oct '06 - 19:28 
Generalchunk sizememberslonial17 Feb '06 - 2:34 
Questionwhy do you need to define MSVC_STL_list_node?sussAnonymous24 Aug '04 - 9:07 
AnswerRe: why do you need to define MSVC_STL_list_node?memberJoaquín M López Muñoz24 Aug '04 - 11:15 
GeneralRe: why do you need to define MSVC_STL_list_node?sussAnonymous24 Aug '04 - 20:47 
GeneralRe: why do you need to define MSVC_STL_list_node?memberJoaquín M López Muñoz25 Aug '04 - 4:11 
GeneralRe: why do you need to define MSVC_STL_list_node?sussAnonymous26 Aug '04 - 9:03 
GeneralRe: why do you need to define MSVC_STL_list_node?sussAnonymous26 Aug '04 - 9:05 
GeneralRe: why do you need to define MSVC_STL_list_node?memberJoaquín M López Muñoz26 Aug '04 - 9:48 
GeneralRe: why do you need to define MSVC_STL_list_node?sussAnonymous26 Aug '04 - 10:51 
GeneralRe: why do you need to define MSVC_STL_list_node?memberJoaquín M López Muñoz26 Aug '04 - 11:32 
GeneralRe: why do you need to define MSVC_STL_list_node?sussAnonymous26 Aug '04 - 20:54 
GeneralRe: why do you need to define MSVC_STL_list_node?memberJoaquín M López Muñoz28 Aug '04 - 9:45 
GeneralRe: why do you need to define MSVC_STL_list_node?sussAnonymous7 Sep '04 - 8:46 
Generalblock_allocated_list::sort() does not return or produces incorrect resultsussPeteH16 Apr '03 - 18:50 
GeneralRe: block_allocated_list::sort() does not return or produces incorrect resultmemberPeteH18 Apr '03 - 11:47 
GeneralRe: block_allocated_list::sort() does not return or produces incorrect resultmemberJoaquín M López Muñoz20 Apr '03 - 21:26 
QuestionAnyone tried this with VS .net?memberbobboberts8 Jan '03 - 15:10 
AnswerRe: Anyone tried this with VS .net?memberJoaquín M López Muñoz9 Jan '03 - 9:24 
GeneralRe: Anyone tried this with VS .net?memberjherico1 May '03 - 13:31 
GeneralRe: Anyone tried this with VS .net?memberJoaquín M López Muñoz4 May '03 - 9:58 
GeneralRe: Anyone tried this with VS .net?memberJoão Paulo Figueira20 Oct '03 - 0:10 
GeneralRe: Anyone tried this with VS .net?memberJoaquín M López Muñoz20 Oct '03 - 0:36 
AnswerRe: Anyone tried this with VS .net?memberRajg26 Jun '04 - 23:40 
GeneralRe: Anyone tried this with VS .net?sussAnonymous16 Jul '05 - 2:59 
GeneralChange in behaviour of list::splicememberBrad Davis19 Apr '02 - 15:31 
GeneralRe: Change in behaviour of list::splicememberJoaquín M López Muñoz20 Apr '02 - 6:35 
QuestionWill this decrease size?memberRusty19 Feb '02 - 13:39 
AnswerRe: Will this decrease size?memberJoaquín M López Muñoz19 Feb '02 - 20:10 
Generalusing with dinkumware librarymemberThomas George14 Feb '02 - 10:26 
GeneralRe: using with dinkumware librarymemberJoaquín M López Muñoz14 Feb '02 - 20:41 
QuestionHow can such an allocator be used in a vector?memberThomas George5 Feb '02 - 5:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 31 Oct 2006
Article Copyright 2000 by Joaquín M López Muñoz
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid