トップページ > プログラム > 2017年03月21日 > ovrpZx5v0

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

9 位/281 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000002201000000106



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん (ワッチョイ 336e-8FG5)
C++相談室 part129 [無断転載禁止]©2ch.net

書き込みレス一覧

C++相談室 part129 [無断転載禁止]©2ch.net
782 :デフォルトの名無しさん (ワッチョイ 336e-8FG5)[sage]:2017/03/21(火) 12:20:28.06 ID:ovrpZx5v0
全く理解してないし、今日初めて知ったんだけど

遅延評価といっても所詮静的なものだから
こんなものはコンパイラが最適化を超がんばれ、って思う
たぶん事の本質は演算の順番を変えることで
(縦に計算するか、横に計算するか、みたいな?)
最適化がかかりやすくなったり速く動いたりできるかもね
って事なんじゃないかと俺は勝手に思った
ただ愚直に演算の順番を変えると記述性に問題が出てくるから
それを防ぐテクニックなのかなーと
よくわからないけど
C++相談室 part129 [無断転載禁止]©2ch.net
785 :デフォルトの名無しさん (ワッチョイ 336e-8FG5)[sage]:2017/03/21(火) 12:54:01.22 ID:ovrpZx5v0
全く理解していない俺が言うのもなんだけど
ムーブコンストラクタは関係ないと思う
演算順序を変えないことには何処かに一時的に計算結果を保存しておかないと
ダメなことには変わりないのでは?

tmp[0] = a[0] + b[0];
tmp[1] = a[1] + b[1];
r[0] = tmp[0] + c[0];
r[1] = tmp[1] + c[1];



r[0] = a[0] + b[0] + c[0];
r[1] = a[1] + b[1] + c[1];

の違いじゃないかなー

これで配列のサイズが1000とかだったらかなり差が出るんだろう
ただ、普通にforループ書けば?って気もするが
そこを演算子のオーバーロードでどうしても記述したいってのが
例の技術なのかと

俺には必要ないかなー
要素数の少ないベクトルはSIMD使うし、要素数の多い配列はループ回すし
C++相談室 part129 [無断転載禁止]©2ch.net
787 :デフォルトの名無しさん (ワッチョイ 336e-8FG5)[sage]:2017/03/21(火) 13:13:33.00 ID:ovrpZx5v0
やだー
それ、aとcが破壊されているじゃないですかーー
r=a+b+c; と同等のコードになりませんよ?
あなたのは a+=b; c+=a; r=c;ですが
そもそも「+=」で破壊していく方針なら、何にも新しくコンストラクトしないんだから
これまたムーブコンストラクタ関係ないじゃないですかーー
どこからムーブコンストラクタが出てくるんですか?
もっとC++勉強してくださいよー
C++相談室 part129 [無断転載禁止]©2ch.net
788 :デフォルトの名無しさん (ワッチョイ 336e-8FG5)[sage]:2017/03/21(火) 13:23:51.34 ID:ovrpZx5v0
r = a + b + c を計算しようと思うと、これはr = (a + b) + c に分解されるだろうから
根本的に(a + b)の結果を保存しておく一時変数がいる
レジスタに配置されるかもしれないとかそういうことはおいておいて
とりあえず一時変数がいる
で、a,b,c,rがベクトルだった場合、一時変数もベクトルになる
これはあまり美味しくない場合がある、ということで
各要素にばらして要素ごとにr = (a + b) + cを実行する
そうすると一時変数はスカラーになる
しかし記述性に難が出るので、それを何とかしようとした

↑これが基本的な要点かと
C++相談室 part129 [無断転載禁止]©2ch.net
796 :デフォルトの名無しさん (ワッチョイ 336e-8FG5)[sage]:2017/03/21(火) 15:17:50.73 ID:ovrpZx5v0
そーゆーことでしょうな
むしろ内部でstd::vectorとか使ってベクトル表現している方が
要素ごとにバラして計算するメリットが出るだろうね
計算途中の一時変数がstd::vectorになるのとスカラになるのとでは
全然違うというか話にならないからね

あと
> ○最後の代入演算子で発生するヒープ確保や代入命令のコストがポインタのすげ替えだけで済む
だけど、たぶんだけどstruct vec{ int x,y,z; };みたいなやつだと
最後の代入はコンパイラの最適化で消えてなくなるだろうから気にしなくてもよいはず
C++にmoveホゲホゲが出来る以前からあった古来からの基本的な最適化だったはず
まぁoperator=を定義して余計なことしてたらその限りじゃないかもしれんが
C++相談室 part129 [無断転載禁止]©2ch.net
800 :デフォルトの名無しさん (ワッチョイ 336e-8FG5)[sage]:2017/03/21(火) 22:47:54.58 ID:ovrpZx5v0
大前提としてチームで開発しているならチームのリーダーに質問してください

自分一人で書いてるなら変数名なんかなんでもよいよ
自分で書いたコードでも一年たったら他人が書いたコードのように読めない
っていう人もいるけど、実際には普通に読めるから変数名は思い付きのテキトーでよい
型名をもじってそのまま変数名にするってのは俺もよくやる

実際変数名は本当に何でもよくて
なぜならスコープが狭かったり、クラスのプライベートメンバだったりして
ごちゃごちゃになったりしないから
問題はクラス名と関数名で、こちらはいつも悩む


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