[v3] Use noexcept in container' move constructors, etc
Paolo Carlini
paolo.carlini@oracle.com
Wed Jun 1 16:14:00 GMT 2011
On 06/01/2011 04:19 PM, Paolo Carlini wrote:
> tested x86_64-linux, committed to mainline. Note: special case
> std::deque. I don't think we can really manage to have its
> move-constructor noexcept withing the current ABI... I'll look into it
> a bit more.
Maybe it's doable. The idea is creating an "emptier then empty" deque,
that is no map allocated, as moved-from in the move-constructor. Then
the latter can be marked noexcept. Afterward, the map can be lazily
created when needed, upon inserts, push_back, what else, as a first
step, with an helper doing something like:
if (!this->_M_impl._M_map)
_M_initialize_map(0);
and then proceed normally. In members like size and empty it's enough to
check this->_M_impl._M_map and return zero of it's null. Thus we have an
additional conditional (for which we should use __builtin_expect) in
member functions but in exchange the move constructor becomes noexcept
and extremely fast. The backward compatibility seems also ok to me,
because we are not going to do the lazy construction of the map in the
default constructor etc, only the C++0x move constructor can do the
trick, thus ABI problems would be possible only for code move
constructing a deque, thus built in C++0x mode, and linked to old code.
But for C++0x mode we don't promise ABI guarantees in terms of linking
together *.o objects, in general. At the moment I'm more concerned with
the performance issue with size, empty, which normally are *extremely*
simple and would get a conditional, even if with builtin_expect.
If somebody has comments...
Paolo.
More information about the Libstdc++
mailing list