vector<bool> _M_start and 0 offset
Jonathan Wakely
jwakely@redhat.com
Mon Sep 17 15:45:00 GMT 2018
On 15/09/18 14:27 +0200, Marc Glisse wrote:
>Hello,
>
>as explained in the PR, the implementation of vector<bool> is weirdly
>wasteful. Preserving the ABI prevents from changing much for now, but
>this small tweak can help the compiler remove quite a bit of dead
>code.
>
>I think most other direct uses of _M_start are in constructors where
>the offset has just been initialized to 0, so the compiler should
>already know enough there, but I may have missed a few relevant places
>where the same idea could be used.
>
>I used C++11 syntax because I find it nicer, and the compiler accepts
>it in C++98 mode with just a warning, suppressed in a standard header.
>
>Bootstrap+regtest on powerpc64le-unknown-linux-gnu.
>
>2018-09-15 Marc Glisse <marc.glisse@inria.fr>
>
> PR libstdc++/87258
> * include/bits/stl_bvector.h (vector::begin(), vector::cbegin()):
> Rebuild _M_start with an explicit 0 offset.
>
>--
>Marc Glisse
>Index: include/bits/stl_bvector.h
>===================================================================
>--- include/bits/stl_bvector.h (revision 264178)
>+++ include/bits/stl_bvector.h (working copy)
>@@ -802,25 +802,25 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> #endif
>
> #if __cplusplus >= 201103L
> void
> assign(initializer_list<bool> __l)
> { _M_assign_aux(__l.begin(), __l.end(), random_access_iterator_tag()); }
> #endif
>
> iterator
> begin() _GLIBCXX_NOEXCEPT
>- { return this->_M_impl._M_start; }
>+ { return { this->_M_impl._M_start._M_p, 0 }; }
>
> const_iterator
> begin() const _GLIBCXX_NOEXCEPT
>- { return this->_M_impl._M_start; }
>+ { return { this->_M_impl._M_start._M_p, 0 }; }
Won't this fail to compile in C++98 mode?
More information about the Libstdc++
mailing list