
Niels Dekker - mail address until 2008-12-31 wrote:
Anyway, I was also considering a more "lightweight" way to tweak MSVC's Swaptimization, merely based upon tr1::has_nothrow_copy (which is included VC9 SP1). Because when using MSVC9, whenever a function like vector<T>::push_back needs to reallocate, it moves its elements /either/ by copy-construction /or/ by default-construction + swap, depending on whether "Swaptimization" is turned on for type T. Isn't it reasonable to just do default-construction + swap, /unless/ T has no-throw copy-construction?
if tr1::has_nothrow_copy<T> move by means of copy else move by means of default-construction + swap
Unless you have a type like boost::function apparently is currently where default construction + swap is also not a no throw operation and is more expensive than a direct copy. Unless you consider swaps like boost::function's a bug I don't think it is fair to assume swap means fast move in general. I think the only real way to get it right in every case is to have the author of the type specify the proper traits.