C++を使って組み込みソフトの仕事をしている三十路エンジニアですが、
恥ずかしながら最近になってムーブセマンティクスの勉強をしております。
こちらのブログで理解は進んだのですが、普段仕事で多用している参照渡しとの使い分けが
しっかりと理解できていません。
例えば、vectorの要素を2倍にする関数をstd::move
で次のように書けると思います。
cpp
#include <vector> #include <utility> std::vector<int> twice_vec(std::vector<int> vec) { for (auto& e : vec) { e *= 2; } return std::move(vec); } int main(void) { std::vector<int> a = {1, 2, 3}; std::vector<int> b = twice_vec(std::move(a)); return 0; }
シンタックスは明らかに異なるものの、同じ「ような」ことを参照渡しで行うと以下のように書けると思います。
cpp
#include <vector> void twice_vec_2(std::vector<int>& vec) { for (auto& e: vec) { e *= 2; } } int main(void) { std::vector<int> a = {1, 2, 3}; twice_vec_2(a); return 0; }
当方の認識では、パフォーマンス的に参照渡しで書いたコードが劣ることはないと理解しています。
この差は、ムーブで書いたほうが各変数がimmutableなように書いてあって分かりやすい以外に何かあるのでしょうか。
どういう時はどっちのほうが良い、などあるのでしょうか。
(極端な話、今までポインタや参照渡しで書かれていたコードは全てムーブセマンティクスで書いたほうが良いというような話なのでしょうか)
何卒、よろしくお願いいたします。
まだ回答がついていません
会員登録して回答してみよう