|
Boost : |
Subject: Re: [boost] [variant] Basic rvalue and C++11 features support
From: Joel de Guzman (djowel_at_[hidden])
Date: 2013-01-05 20:40:20
Hi,
I just looked at the current state of variant and noticed that the implementation
of recursive_variant's move ctor seems to be not as optimal as I hoped. The
current implementation as written is:
recursive_wrapper<T>::recursive_wrapper(recursive_wrapper&& operand)
: p_(new T( detail::variant::move(operand.get()) ))
{
}
Unless I am mistaken, I think the heap allocation is not needed
and the target should simply grab the pointer and mark the source
pointer as 0 (with additional checks for 0 in the dtor):
template <typename T>
recursive_wrapper<T>::recursive_wrapper(recursive_wrapper&& operand)
: p_(operand.release())
{
}
template <typename T>
T* recursive_wrapper<T>::release()
{
T* ptr = p_;
p_ = 0;
return ptr;
}
template <typename T>
recursive_wrapper<T>::~recursive_wrapper()
{
if (p_)
boost::checked_delete(p_);
}
The tests are running just fine (tested with gcc, msvc) with this
(more optimal) implementation. I also run the Spirit test suite
(Spirit makes heavy use of variant).
Thoughts? I can commit this patch if it is acceptable.
Regards,
-- Joel de Guzman http://www.boostpro.com http://boost-spirit.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk