[patch] No allocation for empty unordered containers

François Dumont frs.dumont@gmail.com
Tue Jun 3 20:44:00 GMT 2014


Hi

     Thanks to the single bucket introduced to make move semantic 
noexcept we can also avoid some over allocations. Here is a patch to 
avoid any allocation on default instantiation, on range constructor when 
range is empty and on construction from an initialization list when this 
list is empty too. I had to make all default hint value to 0 so that if 
this value is used the rehash policy next bucket returns 1 bucket.

     I don't know if you had in mind to noexcept qualify the default 
constructor but it would mean to have a real default constructor and 
another to deal with the hint which wouldn't match the Standard so no 
noexcept qualification at the moment.

Tested under Linux x86_64.normal debug and profile modes.


2014-06-03  François Dumont <fdumont@gcc.gnu.org>

     * include/bits/hashtable.h: Make use of the internal single bucket to
     limit allocation as long as container remains empty.
     * include/bits/unordered_map.h: Set default bucket hint to 0 in
     constructors to avoid allocation.
     * include/bits/unordered_set.h: Likewise.
     * include/debug/unordered_map: Likewise.
     * include/debug/unordered_set: Likewise.
     * include/profile/unordered_map: Likewise.
     * include/profile/unordered_set: Likewise.
     * src/c++11/hashtable_c++0x.cc (_Prime_rehash_policy::_M_next_bkt):
     Returns 1 for hint 0.
     * testsuite/23_containers/unordered_map/allocator/
     empty_instantiation.cc:    New.
     * testsuite/23_containers/unordered_multimap/allocator/
     empty_instantiation.cc:    New.
     * testsuite/23_containers/unordered_set/allocator/
     empty_instantiation.cc: New.
     * testsuite/23_containers/unordered_multiset/allocator/
     empty_instantiation.cc: New.

Ok to commit ?

François


-------------- next part --------------
A non-text attachment was scrubbed...
Name: hashtable.patch
Type: text/x-patch
Size: 22878 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20140603/c60a1fd9/attachment.bin>


More information about the Libstdc++ mailing list