Limit Debug mode impact: overload __niter_base
Jonathan Wakely
jwakely@redhat.com
Tue Jun 26 16:03:00 GMT 2018
On 18/06/18 23:01 +0200, François Dumont wrote:
>Hi
>
>Â Â Â I abandon the idea of providing Debug algos, it would be too much
>code to add and maintain. However I haven't quit on reducing Debug
>mode performance impact.
>
>Â Â Â So this patch make use of the existing std::__niter_base to get
>rid of the debug layer around __gnu_debug::vector<>::iterator so that
>__builtin_memmove replacement can take place.
>
>Â Â Â As _Safe_iterator<> do not have a constructor taking a pointer I
>change algos implementation so that we do not try to instantiate the
>iterator type ourselves but rather rely on its operators + or -.
>
>Â Â Â The small drawback is that for std::equal algo where we can't use
>the __glibcxx_can_increment we need to keep the debug layer to make
>sure we don't reach past-the-end iterator. So I had to remove usage of
>__niter_base when in Debug mode, doing so it also disable potential
>usage of __builtin_memcmp when calling std::equal on
>std::__cxx1998::vector<> iterators. A rather rare situation I think.
>
>Â Â Â Note that I don't know how to test that __builtin_memmove has been
>indeed used. So I've been through some debug sessions to check that.
The attached patch (not fully tested) seems to be a much simpler way
to achieve the same thing. Instead of modifying all the helper
structs, just define a new function to re-wrap the result into the
desired iterator type.
>diff --git a/libstdc++-v3/include/debug/stl_iterator.h b/libstdc++-v3/include/debug/stl_iterator.h
>index a6a2a76..eca7203 100644
>--- a/libstdc++-v3/include/debug/stl_iterator.h
>+++ b/libstdc++-v3/include/debug/stl_iterator.h
>@@ -120,4 +120,19 @@ namespace __gnu_debug
> #endif
> }
>
>+#if __cplusplus >= 201103L
>+namespace std
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+template<typename _Iterator, typename _Container, typename _Sequence>
>+ _Iterator
>+ __niter_base(const __gnu_debug::_Safe_iterator<
>+ __gnu_cxx::__normal_iterator<_Iterator, _Container>,
>+ _Sequence>&);
>+
>+_GLIBCXX_END_NAMESPACE_VERSION
>+}
>+#endif
Why is this overload only defined for C++11 and later? I defined it
unconditionally in the attached patch.
What do you think?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 3676 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20180626/95875d5b/attachment.bin>
More information about the Libstdc++
mailing list