トップページ > プログラム > 2014年07月05日 > Im7i5kcd

書き込み順位&時間帯一覧

8 位/223 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000001000025008



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
555
【初心者歓迎】C/C++室 Ver.91【環境依存OK】

書き込みレス一覧

【初心者歓迎】C/C++室 Ver.91【環境依存OK】
555 :デフォルトの名無しさん[age]:2014/07/05(土) 15:18:14.89 ID:Im7i5kcd
複数のメンバをコンストラクタの引数で初期化するようなクラスを作ってんですが、
なるべく高速に動作させたいので、const参照以外にも右辺値参照も受け取れるよう
にしたいんですが、

class C {
private:
const M1 m1;
const M2 m2;
public:
C(const M1 &x1, const M2 &x2): m1(x1), m2(x2) {}
C(M1 &&x1, const M2 &x2): m1(x1), m2(x2) {}
C(const M1 &x1, M2 &&x2): m1(x1), m2(x2) {}
C(M1 &&x1, M2 &&x2): m1(x1), m2(x2) {}
};

こんなかんじで、2のメンバ数乗個のコンストラクタを書かずに済む方法ってありますか?
クラスM1やM2には、コピーコンストラクタとムーブコンストラクタが定義済みってことで。
【初心者歓迎】C/C++室 Ver.91【環境依存OK】
558 :555[sage]:2014/07/05(土) 20:49:00.54 ID:Im7i5kcd
>>556
http://codepad.org/IWIjpHFC
やってみたけどうまくいかなかった。
クラスC1をコンストラクトする段階で、M1やM2のコピーコンストラクタが
move可能な状況でも呼ばれる。

C2みたいに書いてようやく所望の動作をしてくれたんだが・・・
初期化リストにいちいちstd::move()とか書かないといけないもんなの?

もうすこしシンプルな書き方知っている方おしえてです。
【初心者歓迎】C/C++室 Ver.91【環境依存OK】
559 :555[sage]:2014/07/05(土) 20:55:30.71 ID:Im7i5kcd
これじゃコンストラクタ引数で初期化したいメンバが4個も5個もあると軽く死ねる。。。

>>557
いみわからんです。値渡しを避けたいから可能な限りムーブを使うんだが。
【初心者歓迎】C/C++室 Ver.91【環境依存OK】
562 :555[sage]:2014/07/05(土) 21:15:06.00 ID:Im7i5kcd
>>560-561
でも、そのコードだとm1オブジェクトがぶっ壊れるんだが。
http://ideone.com/fZ7eB6
【初心者歓迎】C/C++室 Ver.91【環境依存OK】
563 :555[sage]:2014/07/05(土) 21:20:22.29 ID:Im7i5kcd
あ、>>560のコードのバグだな。
c2dのコンストラクタ呼び出しで、不要なmoveが入ってる。
どうもわかってきた。サンクス。
【初心者歓迎】C/C++室 Ver.91【環境依存OK】
565 :555[sage]:2014/07/05(土) 21:32:06.45 ID:Im7i5kcd
うん、書き込んでから、そういう意図かな、と気づいた。
ただ激しくバグの素の匂いがするコードなのであまり関心できない。

あとは、このムーブのオーバーヘッドを無視できるかだなぁ。。。

あと、値渡しコンストラクタ引数が初期化リストで一回使われるだけの
時とか、勝手に右辺値に変えてくれたりの最適化ってしてくんないのかね。
【初心者歓迎】C/C++室 Ver.91【環境依存OK】
568 :デフォルトの名無しさん[sage]:2014/07/05(土) 21:47:42.49 ID:Im7i5kcd
もっと11の最適化が進んだら、そのうちmoveはgoto並みの劇薬扱い
されるようになる様子が目に浮かぶわ・・・
【初心者歓迎】C/C++室 Ver.91【環境依存OK】
571 :デフォルトの名無しさん[sage]:2014/07/05(土) 21:56:53.63 ID:Im7i5kcd
C++11自体が正気じゃない。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。