Hi When I proposed to change std::hash for pointers my plan was to use this approach for the debug containers. So here is the patch leveraging on this technique to avoid going through _Hash_impl to hash address and get mutex index from it. I think it is obious that new access is faster so I didn't wrote a performance test to demonstrate it. Drawback is new exported symbols. * include/debug/safe_base.h (_Lowest_power_of_two<>): New. (_Safe_sequence_base): Make _Safe_iterator_base friend. (_Safe_sequence_base::_M_detach_singular(size_t)): New. (_Safe_sequence_base::_M_revalidate_singular(size_t)): New. (_Safe_sequence_base::_M_swap(_Safe_sequence_base&, size_t)): New. (_Safe_sequence_base::_M_get_mutex(size_t)): New. (_Safe_iterator_base::_M_get_mutex(size_t)): New. (_Safe_iterator_base::_M_attach(_Safe_sequence_base*, bool, size_t)): New. (_Safe_iterator_base::_M_detach(size_t)): New. (_Safe_iterator_base(const _Safe_sequence_base*, bool)): Replace by... (_Safe_iterator_base(const _Safe_sequence_base*, bool, size_t)): ...this. (_Safe_iterator_base(const _Safe_iterator_base&, bool)): Replace by... (_Safe_iterator_base(const _Safe_iterator_base&, bool, size_t)): ...this. (~_Safe_iterator_base()): Delete. * include/debug/bitset (bitset::_S_alignment()): New. (bitset::reference::~reference()): New. (bitset::reference::reference(const _Base_ref&, bitset*)): Adapt. (bitset::reference::reference(const reference&)): Adapt. * include/debug/safe_iterator.h (_Safe_iterator::_M_get_mutex()): New. (_Safe_iterator::_Safe_iterator(const _Iterator&, const _Safe_sequence_base*)): Adapt. (_Safe_iterator::~_Safe_iterator()): New. (_Safe_iterator::_M_detach()): New. (_Safe_iterator::_M_attach(_Safe_sequence_base*)): Adapt. * include/debug/safe_iterator.tcc: Remove trailing line. * include/debug/safe_local_iterator.h (_Safe_local_iterator<>): Rename _Sequence template parameter into _Container. (_Safe_local_iterator::_M_get_mutex()): New. (_Safe_local_iterator::_Safe_local_iterator(const _Iterator&, const _Safe_sequence_base*)): Adapt. (_Safe_local_iterator::~_Safe_local_iterator()): New. (_Safe_local_iterator::_M_detach()): New. (_Safe_local_iterator::_M_attach(_Safe_sequence_base*)): Adapt. * include/debug/safe_sequence.h (_Safe_sequence::_S_alignment()): New. (_Safe_sequence::_Safe_sequence(_Safe_sequence&&)): New. (_Safe_sequence::_M_get_mutex()): New. (_Safe_sequence::_M_detach_singular()): New. (_Safe_sequence::_M_revalidate_singular()): New. (_Safe_sequence::_M_swap(_Safe_sequence&)): New. * include/debug/safe_unordered_base.h (_Safe_local_iterator_base(const _Safe_sequence_base*, bool)): Replace by... (_Safe_local_iterator_base(const _Safe_sequence_base*, bool, size_t)): ...this. (_Safe_local_iterator_base(const _Safe_local_iterator&, bool)): Replace by... (_Safe_local_iterator_base(const _Safe_local_iterator&, bool, size_t)): ...this. (_Safe_local_iterator_base::~_Safe_local_iterator_base()): Delete. (_Safe_local_iterator_base::_M_attach(_Safe_sequence_base*, bool, size_t)): New. (_Safe_local_iterator_base::_M_detach(size_t)): New. (_Safe_unordered_container_base(_Safe_unordered_container_base&&)): Delete. (_Safe_unordered_container_base::_M_swap( _Safe_unordered_container_base&, size_t)): New. (_Safe_unordered_container_base::_M_attach_local(_Safe_iterator_base*, bool, size_t)): New. (_Safe_unordered_container_base::_M_detach_local(_Safe_iterator_base*, size_t)): New. * include/debug/safe_unordered_container.h (_Safe_unordered_container::_S_alignment()): New. (_Safe_unordered_container::_Safe_unordered_container( _Safe_unordered_container&&)): New. (_Safe_unordered_container::_M_get_mutex()): New. (_Safe_unordered_container::_M_swap(_Safe_unordered_container&)): New. * src/c++11/debug.cc: Adapt. * testsuite/23_containers/vector/debug/mutex_association.cc: New. * config/abi/pre/gnu.ver: Add new symbols. Tested under Linux x86_64. François