PR 71181 Avoid rehash after reserve

Jonathan Wakely jwakely@redhat.com
Fri Jun 17 09:22:00 GMT 2016


On 16/06/16 21:29 +0200, François Dumont wrote:
>Here is a new version compiling all your feedbacks.
>
>    PR libstdc++/71181
>    * include/tr1/hashtable_policy.h
>    (_Prime_rehash_policy::_M_next_bkt): Make past-the-end iterator
>    dereferenceable to avoid check on lower_bound result.
>    (_Prime_rehash_policy::_M_bkt_for_elements): Call latter.
>    (_Prime_rehash_policy::_M_need_rehash): Likewise.
>    * src/c++11/hashtable_c++0x.cc (_Prime_rehash_policy::_M_next_bkt):
>    Always return a value greater than input value. Set _M_next_resize to
>    max value when reaching highest prime number.
>    * src/shared/hashtable-aux.cc (__prime_list): Add comment about 
>sentinel
>    being now useless.
>    * testsuite/23_containers/unordered_set/hash_policy/71181.cc: New.
>    * testsuite/23_containers/unordered_set/hash_policy/power2_rehash.cc
>    (test02): New.
>    * 
>testsuite/23_containers/unordered_set/hash_policy/prime_rehash.cc: 
>New.
>    * testsuite/23_containers/unordered_set/hash_policy/rehash.cc:
>    Fix indentation.

Great - OK for trunk, thanks.


>On 15/06/2016 10:29, Jonathan Wakely wrote:
>>On 14/06/16 22:34 +0200, François Dumont wrote:
>>>>>   const unsigned long* __next_bkt =
>>>>>-      std::lower_bound(__prime_list + 5, __prime_list + 
>>>>>__n_primes, __n);
>>>>>+      std::lower_bound(__prime_list + 6, __prime_list_end, __n);
>>>>>+
>>>>>+    if (*__next_bkt == __n && __next_bkt != __prime_list_end)
>>>>>+      ++__next_bkt;
>>>>
>>>>Can we avoid this check by searching for __n + 1 instead of __n with
>>>>the lower_bound call?
>>>
>>>Yes, that's another option, I will give it a try.
>>
>>I did some comparisons and this version seems to execute fewer
>>instructions in some simple tests, according to cachegrind.
>>
>The only drawback is that calling _M_next_bkt(size_t(-1)) doesn't give 
>the right result. But reaching this kind of value is not likely to 
>happen in real use cases so it is acceptable.

Yes, good point. I don't think we can ever have that many buckets,
because each bucket requires more than one byte, so we can't fit that
many buckets in memory anyway.



More information about the Gcc-patches mailing list