検討:
#include <cstdlib>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
class Gizmo
{
public:
Gizmo() : foo_(shared_ptr<string>(new string("bar"))) {};
Gizmo(Gizmo&& rhs); // Implemented Below
private:
shared_ptr<string> foo_;
};
/*
// doesn't use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(rhs.foo_)
{
}
*/
// Does use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(std::move(rhs.foo_))
{
}
int main()
{
typedef vector<Gizmo> Gizmos;
Gizmos gizmos;
generate_n(back_inserter(gizmos), 10000, []() -> Gizmo
{
Gizmo ret;
return ret;
});
random_shuffle(gizmos.begin(), gizmos.end());
}
上記のコードには、2つのバージョンがあります。1Gizmo::Gizmo(Gizmo&&)
つはstd::move
実際にを移動するために使用しshared_ptr
、もう1つは単にをコピーするために使用しshared_ptr
ます。
どちらのバージョンも表面的には機能しているようです。1つの違い(私が見ることができる唯一の違い)は、非move
バージョンでは、の参照カウントshared_ptr
が一時的に増加しますが、ほんの短時間です。
私は通常先に進みますmove
がshared_ptr
、コードで明確で一貫性を保つためだけです。ここで考慮事項がありませんか?技術的な理由で、一方のバージョンをもう一方のバージョンよりも優先する必要がありますか?