Implementing clean and simple move symantics
Chris Jefferson
caj@cs.york.ac.uk
Wed Nov 24 11:01:00 GMT 2004
Joe Buck wrote:
>On Tue, Nov 23, 2004 at 05:55:36PM +0000, Chris Jefferson wrote:
>
>
>>[ approach to move semantics ]
>>
>>For most types T , using this involves 2 steps:
>>1) Add an overload to _Moveable while sets _M_type to 1.
>>2) Add a new constructor which takes _Moveable<T> t, performs default
>>construction then does this->swap(t)
>>3) Add a new operator= which takes _Moveable<T> t and performs
>>this->swap(t);
>>
>>
>
>This will yield improvements for types where default construction is
>cheap, and swapping is cheap. But it is inferior to what could be
>achieved if you take advantage of objects that can be relocated by a
>simple memmove. Consider std::vector<std::string>, where an element in
>the middle of the vector is erased. Ideally, we would want to destroy the
>deleted element, then use memmove to shift the whole array of strings back
>by one (no need to adjust any reference counts). With your approach, it
>appears that we must do N swaps (where N is the number of elements
>following the deleted element), followed by the destruction of the element
>to be deleted). It appears that at least three times as many word read
>and word write operations are needed (the swap does three assignments
>where the memmove needs one). If you're going to do the work of modifying
>everything, you may as well have a vector class that is three times
>faster.
>
>Nevertheless, swap is better if you really need a swap, as you do in
>sorting. I think that the move semantics work should support both
>methods.
>
>
Hmm.. I'll have to think about this a bit. In actual fact, I think all
of the standard containers look like they can be moved by memmove, and
(quick test program), that is faster even for things like sorting
vectors of vectors and such things. However using memmove involves being
quite careful if its being used for things like sorting, and I suspect
it would be very hard to avoid code duplication (which is what I was
trying to do before). It might simply be unavoidable, in which case
we'll have to live with it :)
Chris
More information about the Libstdc++
mailing list