2017-06-15 8 views
0

これはおそらく他の質問によく似ています。私はちょっと見渡しましたが、確かに私がよく話していることは分かりません。std :: move in-place operation

私はBLAS呼び出しでインプリメントされているはずの機能を書いています。 BLASコールはインプレースではないので、私は一時的にする必要があります。したがって:

void InPlace(ArrayClass& U, const TransformMatrix* M){ 
    ArrayClass U_temp; 
    CallBLASdgemm(U, M, U_temp); //Now U_temp contains the correct output. 
    U = std::move(U_temp); 
} 

これはstd::moveの有効な使用である、または私は何とか「コピーの省略」を壊す(またはそれが他の何らかの理由で悪いです)のですか?

編集:CallBLASDgemmの署名が要求されました。それは

CallBLASdgemm(const ArrayClass& U, const TransformMatrix* M, 
       ArrayClass& V); 
+3

いいです。 'ArrayClass'が移動割り当てをサポートしていなければ、それでもあなたはそれをコピーします。 –

+2

'CallBLASdgemm'の署名は何ですか? –

答えて

2

この場合、コピーエリミッションの有無にかかわらずコピーは実行されません。既に問題ありません。 U_tempは、コンパイラはあなたがしたい場合はコピーコンストラクタを呼び出す必要があり、左辺値であるので:

U = U_temp; 

はしかし、あなたはU_tempはもう使用されないことを知っているので、その値を離れることは、おそらく完全に安全とできることです(つまり、ArrayClassが移動割り当てコンストラクタを実装している場合)。ここではstd::moveを使用しても問題ありません。

+1

@TobySpeight私は決してそれを得ることはできません、ありがとう。 –

2

はいです。これは有効な使用例です。名前付きの一時的な値(左辺値)がある場合は、Uに移動する唯一の方法はstd::moveを使用して右辺値にキャストします。

あなたが心配しているのは、人々が行うときだと思いますreturn std::move(object);。これは、オブジェクトの戻り値へのコピーがほとんどの場合省略されるため、悲観化です。

1

これは有効です。しかし、私は何をしたいことはこれです:

同じコードを実行しますが、一時的には、外側のスコープに表示されずにそれをしない
ArrayClass myCallBLASdgemm(const ArrayClass& U, const TransformMatrix* M) { 
    ArrayClass tmp; 
    CallBLASdgemm(U, M, tmp); 
    return tmp; // elided move 
} 
void InPlace(ArrayClass& U, const TransformMatrix* M){ 
    U = myCallBLASdgemm(U, M); 
} 

。実際に

myCallBLASdgemmはおそらくInPlaceを排除し、あなたがそれを必要な場所だけmyClassBLASdgemmを呼び出すことができますので、きれいです。

関連する問題