今夜、私は過去数日間に取り組んできたいくつかのコードを調べ、moveセマンティクス、特にstd::moveについて読み始めました。私が正しい道を進んでいて、愚かな仮定をしないことを確実にするためにあなたにプロに尋ねるいくつかの質問があります!
まず:
1)元々、私のコードには大きなベクトルを返す関数がありました。
template<class T> class MyObject
{
public:
std::vector<T> doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(theVector);
}; // eo doSomething
}; // eo class MyObject
「theVector」がこれと「throw-away」で一時的であるとすると、関数を次のように変更しました。
std::vector<T>&& doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(static_cast<std::vector<T>&&>(theVector));
}; // eo doSomething
これは正しいです?このようにすることの落とし穴はありますか?
std::string
2)ある関数で、moveコンストラクターが自動的に呼び出されることを返すことに気づきました。文字列の戻り値(ありがとう、アラゴルン)にデバッグすると、明示的な移動コンストラクターと呼ばれることに気づきました。ベクトルではなく文字列クラス用のものがあるのはなぜですか?
移動セマンティクスを利用するために、この関数に変更を加える必要はありませんでした。
// below, no need for std::string&& return value?
std::string AnyConverter::toString(const boost::any& _val) const
{
string ret;
// convert here
return(ret); // No need for static_cast<std::string&&> ?
}; // eo toString
3)最後に、いくつかのパフォーマンステストを実行したかったのですが、std :: moveセマンティクスが原因で得られた驚くほど高速な結果ですか、それともコンパイラ(VS2010)も最適化を実行しましたか?
_getMilliseconds()
(簡潔にするために省略の実装)
std::vector<int> v;
for(int a(0); a < 1000000; ++a)
v.push_back(a);
std::vector<int> x;
for(int a(0); a < 1000000; ++a)
x.push_back(a);
int s1 = _getMilliseconds();
std::vector<int> v2 = v;
int s2 = _getMilliseconds();
std::vector<int> v3 = std::move(x);
int s3 = _getMilliseconds();
int result1 = s2 - s1;
int result2 = s3 - s2;
結果は明らかに素晴らしいものでした。result1は、標準の割り当てで、630ミリ秒かかりました。2番目の結果は0msでした。これはこれらのことの良いパフォーマンステストですか?
これのいくつかは多くの人にとって明らかなことですが、コードをブレザーする直前にセマンティクスを理解していることを確認したいと思います。
前もって感謝します!