アフィリエイト広告を利用しています

広告

posted by fanblog

2018年01月18日

《その242》 関数 swap


 関数 swap

 関数 swap は、2つの値を交換しますが、
関数テンプレートとして与えられるその定義ついては、2011年の C++11 で変更されています。

 【1】C++11 の前までは、<algorithm>ヘッダで次のように定義されていました。

template void std::swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}


 【2】C++11 以後は、<utility>ヘッダで次のように定義されています。

template void std::swap(T& a, T& b) {
T temp = std::move(a);
a = std::move(b);
b = std::move(temp);
}



 「 move 」 に関して、新版明解C++中級編では、関数テンプレート swap の紹介をしている程度で索引にも記載がありません。
中級編のレベルでは まだまだここはちょっと、ということでしょうか ( _ _ )...


 古いほうの定義では、
  T temp = a; でコピーコンストラクタが、
  a = b; で代入演算子が、
  b = temp; でも代入演算子が、
それぞれはたらくので、コスト的に不利ということなのだと思います。


 それに対して、move を使うほうの定義は、コピーコンストラクタや代入演算子を使わずに、
かなり乱暴で大雑把な表現になりますが、手渡す感じで値の移動を行うのでコスト的に有利、ということでしょうか。
ただし、

move は引数を移動しません。 代わりに、その引数 (左辺値である可能性がある) を無条件に右辺値参照にキャストすることにより、型の移動が有効である場合、コンパイラは引数 に渡された値をコピーではなく移動できます。 型の移動が有効ではない場合は、代わりにコピーされます。https://msdn.microsoft.com/ja-jp/library/ee390941.aspx

つまり、引数を身軽な右辺値参照にキャストして手渡すということだと思います。結果として、値が移動したイメージ・・・という解釈でいいのかどうか。とりあえず、新版明解C++中級編ではスルーしているので、自分なりの解釈で無理やり納得して、先に進みます レ(゚∀゚;)ヘ


 以下は利用例です。

#include <iostream>
using namespace std;

class C {
public:
int n;
C(int x = 0) : n(x) { }
};

template<class T> void swp_org(T& a, T& b) {
T t = a; a = b; b = t;
}

template<class T> void swp_mov(T& a, T& b) {
T t = move(a); a = move(b); b = move(t);
}

int main() {
C s(1);
C t(2);
cout << s.n << " " << t.n << '\n';

swp_org(s, t);
cout << s.n << " " << t.n << '\n';

swp_mov(s, t);
cout << s.n << " " << t.n << '\n';
}

f09_0001.png



この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7211262
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。