[v3] Fix management of non empty hash functor
François Dumont
frs.dumont@gmail.com
Wed Jan 16 20:44:00 GMT 2013
Hi
No one to validate this patch ?
Note that it can be considered as a bug fix because without it
using unordered containers with a non-empty hash functor will produce
bad code for local iterators.
François
On 01/10/2013 10:02 PM, François Dumont wrote:
> Hi
>
> Here is an other version of this patch. Indeed there were no need
> to expose many stuff public. Inheriting from _Hash_code_base is fine,
> it is not final and it deals with EBO itself. I only kept usage of
> _Hashtable_ebo_helper when embedding H2 functor. As it is an extension
> we could have impose it not to be final but it doesn't cost a lot to
> deal with it. Finally I only needed a single friend declaration to get
> access to the H2 part of _Hash_code_base.
>
> I didn't touch the default cache policy for the moment except
> reducing constraints on the hash functor. I prefer to submit an other
> patch to change when we cache or not depending on the hash functor
> expected performance.
>
> I also took the time to replace some typedef expressions with
> using ones. I really know what is the rule about using one or the
> other but I remembered that Benjamin spent quite some time changing
> typedef in using so I prefer to stick to this approach in this file,
> even if there are still some typedef left.
>
> Tested under linux x86_64 normal and debug modes.
>
> 2013-01-10 François Dumont <fdumont@gcc.gnu.org>
>
> * include/bits/hashtable_policy.h (_Local_iterator_base): Use
> _Hashtable_ebo_helper to embed necessary functors into the
> local_iterator when necessary. Pass information about functors
> involved in hash code by copy.
> * include/bits/hashtable.h (__cache_default): Do not cache for
> builtin integral types unless the hash functor is not noexcept
> qualified or is not default constructible. Adapt static assertions
> and local iteraror instantiations.
> * include/debug/unordered_set
> (std::__debug::unordered_set<>::erase): Detect local iterators to
> invalidate using contained node rather than generating a dummy
> local_iterator instance.
> (std::__debug::unordered_multiset<>::erase): Likewise.
> * include/debug/unordered_map
> (std::__debug::unordered_map<>::erase): Likewise.
> (std::__debug::unordered_multimap<>::erase): Likewise.
> * testsuite/performance/23_containers/insert_erase/41975.cc: Test
> std::tr1 and std versions of unordered_set regardless of any
> macro. Add test on default cache behavior.
> * testsuite/performance/23_containers/insert/54075.cc: Likewise.
> * testsuite/23_containers/unordered_set/instantiation_neg.cc:
> Adapt line number.
> * testsuite/23_containers/unordered_set/
> not_default_constructible_hash_neg.cc: New.
> * testsuite/23_containers/unordered_set/buckets/swap.cc: New.
>
> If you agree with the patch tell me where and when to apply it.
>
> François
>
>
> On 01/04/2013 12:17 PM, Paolo Carlini wrote:
>> Hi,
>>
>> On 12/13/2012 10:32 PM, François Dumont wrote:
>>> Hi
>>>
>>> As part of a performance patch proposed in an other mailing
>>> thread was a patch to improve management of hash functor with state.
>>> This part is I think less sensible than the performance patch so I
>>> propose it independently. I only would like to commit the
>>> modification on the performance tests here if you don't mind.
>>>
>>> Thanks to this patch caching the hash code or not doesn't depend
>>> on the hash functor to be empty of final anymore. I only keep the
>>> default constructible condition so that local_iterator can be
>>> default constructible, considering it is a Standard request.
>> I'm finally having a closer look at this work of yours (sorry aboutt
>> the delay!) and I think we want something similar for 4.8.0. However,
>> to be honest, I'm not convinced we are implementing the general idea
>> in the best way, in particular I don't like the much more complex
>> access control structure, _Hash_code_base loses encapsulation, etc.
>> Did you consider maybe adding friend declarations in a few places?
>>
>> Jon, do you have suggestiong? The idea of managing to get rid of the
>> empty & !final requirement for dispatching seems right to me.
>>
>> By the way, I'm also not convinced that is_integral is the right
>> category, I think is_scalar for example is better: pointers are
>> common and very similar in terms of std::hash, likewise floating
>> point quantities (with the possible exception of long double, but I
>> don't think we should spend time on it).
>>
>> Paolo.
>>
>
More information about the Libstdc++
mailing list