1 名前:デフォルトの名無しさん (ワッチョイ dfcf-HvS5) mailto:sage [2017/01/09(月) 14:49:27.56 ID:p96WJVyd0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part128 echo.2ch.net/test/read.cgi/tech/1480172629/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.100【環境依存OK】 echo.2ch.net/test/read.cgi/tech/1478440682/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
765 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/19(日) 09:49:17.20 ID:7dJ8iAqk0.net] ちなみに誰かと確認してみたが、 > std::bindを見てECMAScriptのbindingと同じものだと勘違いしていただけか。(>>688 ) なるほど、その通りだ。俺が思っていたbindとはだいぶ違う。
766 名前:デフォルトの名無しさん (ワッチョイ 5319-v8EU) mailto:sage [2017/03/19(日) 09:52:16.04 ID:/fHKNSq50.net] 直接<間接=関数ポインター<λ<バインド なぜならバインドは内部で関数ポインターを使うしかないから ラムダは言語で実装されてるから。
767 名前:デフォルトの名無しさん (ササクッテロル Sp97-q0jq) mailto:sage [2017/03/19(日) 17:47:12.05 ID:SFAOW7ATp.net] 関数呼び出しのコストでここまで議論できるって凄いな 普段C++で何作ってんだろ
768 名前:デフォルトの名無しさん (ワッチョイ 537b-gO1F) [2017/03/19(日) 18:17:17.48 ID:jcDR9uoj0.net] >>750 議論ではなく出来の悪い生徒の補習してただけだから。
769 名前:デフォルトの名無しさん (ワッチョイ f37b-12+v) mailto:sage [2017/03/19(日) 18:21:02.30 ID:V1EWIlT/0.net] ギリギリ迫るのも楽しいものです
770 名前:デフォルトの名無しさん (ワッチョイ 2302-nFTW) mailto:sage [2017/03/19(日) 18:49:00.48 ID:6JgBGVv40.net] >>750 え、Hello worldだよ?
771 名前:デフォルトの名無しさん (ワッチョイ 7302-12+v) mailto:sage [2017/03/19(日) 20:26:30.60 ID:fEuC6OUR0.net] ある時系列データにフィルタを通した任意の範囲のデータを扱うクラスを作るんだが 今だとイテレータよりRangeの方が良いのか?
772 名前:デフォルトの名無しさん (ワッチョイ f37b-12+v) mailto:sage [2017/03/19(日) 22:20:21.59 ID:V1EWIlT/0.net] もう少し具体的に と思います
773 名前:デフォルトの名無しさん (ワッチョイ 8330-PVeP) mailto:sage [2017/03/20(月) 00:26:19.05 ID:V0m6X4Gc0.net] 基本的にレンジはイテレータのペアのラッパでしかなく イテレータが無くなるわけでもないからとりあえずはイテレータを前提に作っておけばよかろ
774 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/20(月) 12:05:47.42 ID:OlwkB3mR0.net] >>737 expression templateは遅延評価による高速化のために使うんやで 速度が必要無いなら要らんのやで >>738 実測してみた? 二項演算子(または結果を戻り値で返す関数)を多用する場合、 x, y, zを持つベクトルなんかだと明らかに効果ある 組み込み型だと全く効果ない
775 名前:デフォルトの名無しさん (ワッチョイ ef6c-i8cA) mailto:sage [2017/03/20(月) 13:05:30.60 ID:ZNh1GxS+0.net] >>757 いつか実装して確かめてみようとは思うんだけど ・数学的に簡略化が可能な場合は当然事前にできるだけ簡略化する ・計算途中の値もよく使うので=が出てきて評価が頻繁 な場合、あんまり効果なさそうだなあというところで二の足
776 名前:デフォルトの名無しさん (ワッチョイ 5319-v8EU) mailto:sage [2017/03/20(月) 13:17:35.04 ID:hOjZeIpo0.net] expression templateってコンビネーターのことじゃね?
777 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/20(月) 13:29:36.59 ID:o1Hy6TV3M.net] >>758 計算途中の値もよく使うって、それ途中と違うがな 函数という考え方について、もう少し勉強した方がいい
778 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/20(月) 14:06:32.00 ID:OlwkB3mR0.net] >>758 あーまだ実装してないのね 自分の実用するコード(4次元までのベクトル、4x4
779 名前:ワでの行列)だと5〜30%くらいの向上なんで、実装する労力考えると最後のダメ押しでもよかったなとは思うけど >・計算途中の値もよく使うので=が出てきて評価が頻繁 一応、a = b + c;程度の式でも効果あるにはある 多分インライン展開されても、レジスタの使用効率がちょっと良くなるんだと思う a = b + c; みたいな式で for (int i = 0; i < 3; i++) a.f[i] = b.f[i] + c.f[i]; という計算に展開された方が、レジスタを使い切らないからじゃないかなと (ちなみにループはアンロールされる前提だけど、ヒープに確保するような長いベクトルでもETの方が効率良いはず あとこの例だと、SSEとかのSIMDのイントリンシック使うと4次元まで組み込み型になるので、全くETの意味が無くなるw) 複数の組み込み型を含む演算で、SIMDとか他の高速化を使った上でさらに速くしたいなら、ETはおすすめしたい ただし計算過程でxがy, zに干渉するような計算(内積、外積とか)にはET使えないので注意 [] [ここ壊れてます]
780 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/20(月) 14:14:14.02 ID:OlwkB3mR0.net] 訂正 Xxがy, zに干渉するような計算 ○各要素を複数回評価するような計算 a = cross(b, c); なら大丈夫だけど a = cross(b, c) * d; とかやると乗算の回数が増えるし計算結果が狂ったりする
781 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/20(月) 14:25:46.95 ID:o1Hy6TV3M.net] >>762 横から補足 ublasなんかは複数回評価を前提としてて、そのまま使うと遅い なので、noaliasというものが用意されてる
782 名前:デフォルトの名無しさん (ワッチョイ cf6b-8YZg) mailto:sage [2017/03/20(月) 16:40:52.42 ID:d0t0+ba+0.net] なるほど よくわからん
783 名前:デフォルトの名無しさん (ワッチョイ bf0b-8YZg) mailto:sage [2017/03/20(月) 17:28:44.64 ID:lZKrgjvb0.net] 結論 expression templateは科学系数値計算にしか効果はない そういうのは既にライブラリーが存在する よって自分でexpression templateを実装する必要に駆られる場面はほぼない
784 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/20(月) 18:08:39.79 ID:OlwkB3mR0.net] >>765 >科学系数値計算にしか効果はない ではなくて、「速度が必要な場面でも、実装する優先度は低い」ならわかる 自分が以前調べた限りでは、ETとSIMDを同時に使ってるものは無かった はっきり言って、速度が重要な局面かつSIMDが使えるマシンなのにまずSIMDを使わないというのは有り得ない けなすわけではないが、SIMD命令がある一般的なマシンにおける数値計算には、今あるETのライブラリはまともに使えんのじゃないか ていうか科学計算ならETより、SIMDやGPGPUを使う方が先 自分の場合はゲームでの計算なんで、CPUかつヒープじゃなくスタックを使う必要があるので その時点でuBlasやBlitzは選択肢から外れるんだわ
785 名前:デフォルトの名無しさん (ワッチョイ 7302-12+v) mailto:sage [2017/03/20(月) 18:31:45.48 ID:E6+3UOyx0.net] あらゆる面で最適化したオープンソースな数値計算ライブラリを作るような人なんて世界でもほぼ居ないだろ 数学と物理や化学とC++での数値計算に関する造詣が深くて、処理系やユースケースを想定して形にできなければいけない 金にならないし趣味にするには地味すぎる 論文が書ければいいけどライブラリ開発自体をメインにすることはできるのかどうかよくわからんし
786 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/20(月) 19:35:01.25 ID:OlwkB3mR0.net] そういうライブラリはかなり難しいだろうね・・・ だから結局自分で作る必要があるんだわ(ETは労力やバグ回避がアレだけど、効果が無いわけではない)
787 名前:デフォルトの名無しさん (ワッチョイ cf6b-8YZg) mailto:sage [2017/03/20(月) 19:39:51.74 ID:d0t0+ba+0.net] お前らの作成したライブラリを配布したらさいつよじゃね?
788 名前:デフォルトの名無しさん (ワッチョイ 537b-gO1F) [2017/03/20(月) 19:44:06.12 ID:+YHRRlIg0.net] Eigenがexpression templateもSIMDも実装してたと思うけど
789 名前:デフォルトの名無しさん (ワッチョイ cf6b-8YZg) mailto:sage [2017/03/20(月) 19:47:48.92 ID:d0t0+ba+0.net] お前らってコード書くとき明示的にスコープ使う??
790 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/20(月) 20:52:21.66 ID:OlwkB3mR0.net] >>770 あーー、そういえばあった・・・・w すまん大嘘こいてた https://ja.wikipedia.org/wiki/C%2B%2B_AMP ちなみにマイナーながらこんなんもある >>771 stdならstd::つけて、それ以外ならusing宣言でよく使うやつだけ取り込むかなぁ
791 名前:デフォルトの名無しさん (ワッチョイ ef8c-h49x) [2017/03/21(火) 00:17:02.18 ID:ooaEszBV0.net] Expression templateって右辺値参照ある今でも必要なの?
792 名前:デフォルトの名無しさん (ワッチョイ a38a-GEdz) mailto:sage [2017/03/21(火) 00:34:26.33 ID:WRmS2jUL0.net] 式テンプレートって遅延評価やそれを利用した最適化が主な目的だとおもうのだけど、それがなんで右辺値参照があるからいらなくなるの?
793 名前:デフォルトの名無しさん (ワッチョイ ef8c-h49x) [2017/03/21(火) 00:42:40.72 ID:ooaEszBV0.net] a = b + c + d の形式の時のコピー数減らすのが式テンプレートの主な功績だとしたら右辺値参照で同じように減らせると思ったんだけど、実際それ以上の最適化ってされてるの?
794 名前:デフォルトの名無しさん (ワッチョイ 7302-12+v) mailto:sage [2017/03/21(火) 00:59:40.31 ID:/NjqKBkb0.net] アセンブラで書くのが一番速い
795 名前:デフォルトの名無しさん (ワッチョイ f3e7-ajdi) mailto:sage [2017/03/21(火) 01:12:11.02 ID:3hTmI8gX0.net] KoDaIJiN
796 名前:デフォルトの名無しさん (ワッチョイ bf3a-lir9) mailto:sage [2017/03/21(火) 01:44:12.85 ID:2crVP7Yr0.net] 石を焼いてしまうのが、一番早い気がする
797 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/21(火) 02:23:03.72 ID:wE8b83TD0.net] >>775 ヒープに確保するようなクラスの演算なら、コピーのコストはそうだね(推測だけど ただし>>761 に書いたようなレジスタ効率(a.f[0]の代入が終わったらストアして以降f[0]を無視できる)もある
798 名前:デフォルトの名無しさん (ワッチョイ 33e6-8FG5) [2017/03/21(火) 03:29:49.89 ID:+DL1LwCN0.net] >>778 それ速いけど早くない
799 名前:デフォルトの名無しさん (ササクッテロレ Sp97-GEdz) mailto:sage [2017/03/21(火) 11:41:46.69 ID:Ub2NtCH4p.net] >>775 たとえばeigenなんかは必要な要素だけ計算されるような工夫があるようだけど
800 名前:デフォルトの名無しさん (ワッチョイ 336e-8FG5) mailto:sage [2017/03/21(火) 12:20:28.06 ID:ovrpZx5v0.net] 全く理解してないし、今日初めて知ったんだけど 遅延評価といっても所詮静的なものだから こんなものはコンパイラが最適化を超がんばれ、って思う たぶん事の本質は演算の順番を変えることで (縦に計算するか、横に計算するか、みたいな?) 最適化がかかりやすくなったり速く動いたりできるかもね って事なんじゃないかと俺は勝手に思った ただ愚直に演算の順番を変えると記述性に問題が出てくるから それを防ぐテクニックなのかなーと よくわからないけど
801 名前:デフォルトの名無しさん (ワッチョイ 534f-v8EU) mailto:sage [2017/03/21(火) 12:35:09.71 ID:bH1u/9cj0.net] Expression templateの一時変数問題は ムーブコンストラクターで解決された問題だよね。
802 名前:デフォルトの名無しさん (ワッチョイ 737a-12+v) mailto:sage [2017/03/21(火) 12:36:27.24 ID:/NjqKBkb0.net] プログラムが扱いやすいように初期値を設定してやるのは人間の仕事
803 名前:デフォルトの名無しさん (ワッチョイ 336e-8FG5) mailto:sage [2017/03/21(火) 12:54:01.22 ID:ovrpZx5v0.net] 全く理解していない俺が言うのもなんだけど ムーブコンストラクタは関係ないと思う 演算順序を変えないことには何処かに一時的に計算結果を保存しておかないと ダメなことには変わりないのでは? 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使うし、要素数の多い配列はループ回すし
804 名前:デフォルトの名無しさん (ワッチョイ 534f-v8EU) mailto:sage [2017/03/21(火) 13:04:15.57 ID:bH1u/9cj0.net] a[0] += b[0]; a[0] += b[1]; c[0] += a[0]; c[1] += a[1]; r[0]=c[0] r[1]=c[1] ムーブコンストラクターを使うとこうなる
805 名前:デフォルトの名無しさん (ワッチョイ 336e-8FG5) mailto:sage [2017/03/21(火) 13:13:33.00 ID:ovrpZx5v0.net] やだー それ、aとcが破壊されているじゃないですかーー r=a+b+c; と同等のコードになりませんよ? あなたのは a+=b; c+=a; r=c;ですが そもそも「+=」で破壊していく方針なら、何にも新しくコンストラクトしないんだから これまたムーブコンストラクタ関係ないじゃないですかーー どこからムーブコンストラクタが出てくるんですか? もっとC++勉強してくださいよー
806 名前:デフォルトの名無しさん (ワッチョイ 336e-8FG5) mailto:sage [2017/03/21(火) 13:23:51.34 ID:ovrpZx5v0.net] r = a + b + c を計算しようと思うと、これはr = (a + b) + c に分解されるだろうから 根本的に(a + b)の結果を保存しておく一時変数がいる レジスタに配置されるかもしれないとかそういうことはおいておいて とりあえず一時変数がいる で、a,b,c,rがベクトルだった場合、一時変数もベクトルになる これはあまり美味しくない場合がある、ということで 各要素にばらして要素ごとにr = (a + b) + cを実行する そうすると一時変数はスカラーになる しかし記述性に難が出るので、それを何とかしようとした ↑これが基本的な要点かと
807 名前:デフォルトの名無しさん (ワッチョイ 534f-v8EU) mailto:sage [2017/03/21(火) 13:29:00.21 ID:bH1u/9cj0.net] 間違えた tmp[0]=a[0] + b[0]; tmp[0]=a[1] + b[1]; tep[0]+=c[0]; tep[1]+=c[1]; r[0]=temp[0] r[1]=temp[1] 一時変数が一個で良いってことだな aかbが右辺値なら1個だ
808 名前:デフォルトの名無しさん (ワッチョイ 534f-v8EU) mailto:sage [2017/03/21(火) 13:30:57.12 ID:bH1u/9cj0.net] また間違えた、aかbが右辺値なら0個だ
809 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/21(火) 13:32:10.85 ID:wE8b83TD0.net] >全く理解していない俺が言うのもなんだけど どこが全く理解していないのかと小一時間w ただムーブ代入演算子やコンストラクタがあれば、”ヒープに要素を確保するクラス”限定で ヒープ確保や代入命令のコストがポインタのすげ替えだけで済むのはある(>>779 ) でもスタックに確保するような固定長のベクトルとかだと、>>785 の通り代入命令の回数が バカにならないので結構差が出てくる 「C++の演算子オーバーロードは遅い」なんて言われることがあるけど、その理由がこれだと思う 演算子オーバーロードが遅いんではなく、計算結果を戻り値で返す関数が遅い (これは計算結果を保証するためなのかどうしようもないんだろうけど) なのでそれを回避するために算術代入使おう、という論もある ただし遅いと言ってもFortranとC/C++の差のレベルなんでアレだけど・・・・ 多分愚直な演算子で書いても、全てインライン展開されれば最適化でベストなコードになると思うんだけど・・・(誰か知ってる人頼む
810 名前:デフォルトの名無しさん (ワッチョイ 534f-v8EU) mailto:sage [2017/03/21(火) 13:32:18.98 ID:bH1u/9cj0.net] もう一個訂正tmp =temp,tem,tmp
811 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/21(火) 13:37:29.55 ID:wE8b83TD0.net] >>789 右辺値についてだいぶ誤解してないか? ムーブコンストラクタ/代入演算子は引数が右辺値である場合の実装を分けられるだけやで
812 名前:デフォルトの名無しさん (ワッチョイ 534f-v8EU) mailto:sage [2017/03/21(火) 13:41:08.81 ID:bH1u/9cj0.net] 実際に tmp[0]=a[0] + b[0]; tmp[0]=a[1] + b[1]; tep[0]+=c[0]; tep[1]+=c[1]; r[0]=temp[0] r[1]=temp[1] 上のと同等の演算が r[0] = a[0] + b[0] + c[0]; r[1] = a[1] + b[1] + c[1]; で出来るというわけで実際に 3回に計算するわけじゃないよ
813 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/21(火) 13:41:36.76 ID:wE8b83TD0.net] 訂正 Xヒープ確保や代入命令のコストがポインタのすげ替えだけで済む ○最後の代入演算子で発生するヒープ確保や代入命令のコストがポインタのすげ替えだけで済む a, b, cの演算結果は依然としてコストあるね
814 名前:デフォルトの名無しさん (ワッチョイ 336e-8FG5) mailto:sage [2017/03/21(火) 15:17:50.73 ID:ovrpZx5v0.net] そーゆーことでしょうな むしろ内部でstd::vectorとか使ってベクトル表現している方が 要素ごとにバラして計算するメリットが出るだろうね 計算途中の一時変数がstd::vectorになるのとスカラになるのとでは 全然違うというか話にならないからね あと > ○最後の代入演算子で発生するヒープ確保や代入命令のコストがポインタのすげ替えだけで済む だけど、たぶんだけどstruct vec{ int x,y,z; };みたいなやつだと 最後の代入はコンパイラの最適化で消えてなくなるだろうから気にしなくてもよいはず C++にmoveホゲホゲが出来る以前からあった古来からの基本的な最適化だったはず まぁoperator=を定義して余計なことしてたらその限りじゃないかもしれんが
815 名前:デフォルトの名無しさん (スプッッ Sddf-8YZg) mailto:sage [2017/03/21(火) 16:21:56.57 ID:rDA5FTfNd.net] umdhの結果でleak検索して出てこなかったらメモリリークしていないって判断して問題ない??
816 名前:デフォルトの名無しさん (ワッチョイ f33c-u6wT) mailto:sage [2017/03/21(火) 18:56:32.83 ID:wE8b83TD0.net] >>796 RVOのことかな?そういえば完全に忘れてた・・・ 確かoperator =を定義していようが副作用があろうが、コンパイラは勝手に コンストラクタや代入演算子の呼び出しを減らしていい、って感じだったと思うんだけど もしかして同じ機能のコンストラクタがあるならoperator =は無駄??
817 名前:デフォルトの名無しさん (ワッチョイ bf90-tpgq) mailto:sage [2017/03/21(火) 22:33:32.67 ID:QxtkUNUp0.net] map<T,U> map; とか for (auto pair : map) というのをつい手癖でやってしまうのですが こういう名前の付け方はやめたほうがいいですか?
818 名前:デフォルトの名無しさん (ワッチョイ 336e-8FG5) mailto:sage [2017/03/21(火) 22:47:54.58 ID:ovrpZx5v0.net] 大前提としてチームで開発しているならチームのリーダーに質問してください 自分一人で書いてるなら変数名なんかなんでもよいよ 自分で書いたコードでも一年たったら他人が書いたコードのように読めない っていう人もいるけど、実際には普通に読めるから変数名は思い付きのテキトーでよい 型名をもじってそのまま変数名にするってのは俺もよくやる 実際変数名は本当に何でもよくて なぜならスコープが狭かったり、クラスのプライベートメンバだったりして ごちゃごちゃになったりしないから 問題はクラス名と関数名で、こちらはいつも悩む
819 名前:デフォルトの名無しさん (ワッチョイ bfcc-UNkP) mailto:sage [2017/03/21(火) 22:53:34.07 ID:BqDV4BtF0.net] やめたほうがいい あとあと混乱するから
820 名前:デフォルトの名無しさん (スップ Sddf-Ma5U) mailto:sage [2017/03/21(火) 22:53:51.11 ID:chOyeLILd.net] あとはインタフェースの一部としての引数名かな。 総じて.cppファイルにだけ書かれる名前はテキトー
821 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/21(火) 23:38:01.75 ID:XhVovTkQM.net] >>799 mapはデータ構造だろ 変数名はそれが何を格納してるかを表してなきゃダメだと思うけど
822 名前:デフォルトの名無しさん (ワッチョイ 03b4-w0Gz) mailto:sage [2017/03/21(火) 23:45:02.12 ID:5oluTi0x0.net] >>803 は健常者
823 名前:デフォルトの名無しさん (ワッチョイ bf90-tpgq) mailto:sage [2017/03/21(火) 23:57:16.03 ID:QxtkUNUp0.net] >>800-804 ありがとうございます。くだらぬ質問でしたね、すみません とりあえず狭いスコープの一時変数用途では map<T,U> m; for (auto p : m) みたいにしておきます
824 名前:デフォルトの名無しさん (ワッチョイ 3fd1-q0jq) mailto:sage [2017/03/21(火) 23:59:23.77 ID:eniBTwk40.net] やめた方がいいですか?なんて聞いてる時点で本人の中でも既に答えは出ているのでは
825 名前:デフォルトの名無しさん (ワッチョイ 737a-12+v) mailto:sage [2017/03/22(水) 00:10:41.47 ID:kq8u5G9J0.net] 使い捨てならアンダーバー付けろ
826 名前:デフォルトの名無しさん (ドコグロ MM57-3fK7) mailto:sage [2017/03/22(水) 06:47:53.98 ID:svIchgSfM.net] >>799 どちらもスコープが狭ければいいと思う 特に pair の方は for 文でよく使われる i みたいなもんだから俺もよくやる map の方はたいていスコープも広いし中身を表す名前にした方が分かりやすいと思う 型名と同じ名前はどうよ? って話なら俺個人的には問題ないでしょって思うけどそう思わない人の方が多いような気がする
827 名前:デフォルトの名無しさん (ワッチョイ f384-ajdi) mailto:sage [2017/03/22(水) 07:01:10.32 ID:2VeNeFOl0.net] for(auto&o : c)て感じでやってるなぁ。 oはobjectのo。
828 名前:デフォルトの名無しさん (スップ Sddf-rwfr) [2017/03/22(水) 07:36:14.20 ID:BzP+Rc7Ad.net] 変数名に型情報をのせるなマイクロソフトじゃあるまいし
829 名前:デフォルトの名無しさん (オッペケ Sr97-w0Gz) mailto:sage [2017/03/22(水) 07:43:37.16 ID:l4RQ+gMQr.net] 別にのせてもいいけど、型でしかその概念
830 名前:捉えられない人にマトモな設計は難しい int intTypeVar=-1; [] [ここ壊れてます]
831 名前:デフォルトの名無しさん (ワッチョイ 534f-v8EU) mailto:sage [2017/03/22(水) 08:29:35.78 ID:IQHE94uk0.net] 変数名に型を載せないほうがカッコいいと思ってるの? それって逆にカッコ悪いと思う。
832 名前:デフォルトの名無しさん (スプッッ Sddf-8YZg) mailto:sage [2017/03/22(水) 08:42:36.10 ID:rgAwiSmKd.net] 変数名に型情報いるか?って話だな そんな情報載せようとするぐらいなら変数名や関数名に拘れ
833 名前:デフォルトの名無しさん (スプッッ Sddf-rwfr) [2017/03/22(水) 08:52:48.82 ID:gPjbW80sd.net] メンバのm_ と同じくらい無意味というか害悪
834 名前:デフォルトの名無しさん (ワッチョイ 53bf-tW1y) [2017/03/22(水) 08:59:06.14 ID:iUoKjy2X0.net] >>814 m_ は好きだけどな。 手で握られてる感じが。
835 名前:デフォルトの名無しさん (ワッチョイ 534f-v8EU) mailto:sage [2017/03/22(水) 09:01:02.66 ID:IQHE94uk0.net] 違いの分かる男 (スプッッ Sddf-rwfr)
836 名前:デフォルトの名無しさん (スプッッ Sddf-8YZg) mailto:sage [2017/03/22(水) 12:11:09.58 ID:rgAwiSmKd.net] フルページヒープしようとしてるがうまくつかえんぞなんだこれ gflag設定して対象ファイル実行するだけでなんとかなるんちゃうのか
837 名前:デフォルトの名無しさん (ワッチョイ 3392-8YZg) mailto:sage [2017/03/22(水) 18:09:01.13 ID:dqBQr4XV0.net] メモリ管理ってどうやってしてる? テスト設計で必要なのだが調べても情報が少なくて使い方もあやふやで困ってる 自分のコードならまだしも人のコードだから品質保証するために必要なので困ってる助けて
838 名前:デフォルトの名無しさん (ドコグロ MM1f-vDuW) mailto:sage [2017/03/22(水) 19:28:52.80 ID:6SOT+CpTM.net] c++の場合、設計段階できっちりメモリ管理しないと死ぬ。 テスト段階だとどうだろ?どんなツールがおすすめかね?
839 名前:デフォルトの名無しさん (ワッチョイ 3392-8YZg) mailto:sage [2017/03/22(水) 19:40:51.16 ID:dqBQr4XV0.net] >>819 昔からのコードだから俺にはなんとも言えないんだなぁ... タスクマネージャー開いて無限ループさせてたら地味にメモリ増えていくからたぶんリークなりメモリ破壊なりなんかしてそうなんだ
840 名前:デフォルトの名無しさん (ワッチョイ f3c8-tpgq) mailto:sage [2017/03/22(水) 19:50:51.39 ID:E1Td5RgZ0.net] >>820 どこでリークが発生していて、どこでfreeするべきかをツールで発見したいって事? そりゃ無理だろ。 それが出来ないからGC言語に逃げているわけだし、 それが出来ればRAIIすらゴミになるでしょ。
841 名前:デフォルトの名無しさん (ワッチョイ cf1f-9jmm) [2017/03/22(水) 19:54:38.25 ID:0C1B3gPp0.net] メモリ管理はPHPとかのほうがムズい。 設計時でもコード書くときでも実動時でもメモリ消費を制御するのはムズい。正常動作でも想定外が起こる。 消費量が判ったところで実働時に減らすことはムズい。 "php メモリ 画面 真っ白 メモリ"とか定番ネタ
842 名前:デフォルトの名無しさん (ワッチョイ 3392-8YZg) mailto:sage [2017/03/22(水) 20:09:07.97 ID:dqBQr4XV0.net] >>821 いやそこまでは出来なくても良い ただ品質として確保したいだけ リークがあるかないかを判断できればおけおけ
843 名前:デフォルトの名無しさん (ドコグロ MM57-3fK7) mailto:sage [2017/03/22(水) 20:13:28.89 ID:svIchgSfM.net] >>818 環境がわからんからアドバイスのしょうがないんだが ソースがあってビルドできるならとりあえず valgrind とかで調べたら? valgrind.org/
844 名前:デフォルトの名無しさん (ワッチョイ 336e-8FG5) mailto:sage [2017/03/22(水) 20:15:04.43 ID:i8R0t7KQ0.net] それならプログラム終了時にすべてのメモリが解放されたかチェックすればOK
845 名前:デフォルトの名無しさん (ワッチョイ 3392-8YZg) mailto:sage [2017/03/22(水) 20:15:57.49 ID:dqBQr4XV0.net] >>824 ふぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉまた英語か... 環境と言えるのはなんだろ visualstudio2008 Windows7 テストしたいのはdll
846 名前:デフォルトの名無しさん (ワッチョイ bf67-lir9) mailto:sage [2017/03/22(水) 20:25:44.20 ID:rzLKjPpj0.net] >>826 昔だったら、ぴゅりふぁい っていうツールがあったけど。
847 名前:デフォルトの名無しさん (ワッチョイ 737a-12+v) mailto:sage [2017/03/22(水) 20:26:09.25 ID:kq8u5G9J0.net] まともな開発環境なら名前以外から変数のスコープと型情報くらい分かるはずだよね
848 名前:デフォルトの名無しさん (ワッチョイ f3c8-tpgq) mailto:sage [2017/03/22(水) 20:26:35.66 ID:E1Td5RgZ0.net] >>826 > テストしたいのはdll それって単にdllの呼び方間違えているだけじゃね? dll
849 名前:呼んだ直後で片っ端からfreeしてみたら直るんじゃね? なおVS2008にはプロファイラが付いてないが、最新VSには付いていたはず。 (俺は使ったこと無いけど) だからとりあえず最新VSでコンパイル通るか試して、そっちでデバッグするのも手だよ。 [] [ここ壊れてます]
850 名前:デフォルトの名無しさん (ワッチョイ cf1f-9jmm) [2017/03/22(水) 20:31:15.79 ID:0C1B3gPp0.net] メモリ確保をすべて乗っ取って動作させてログ吐き出すやつでいいのでは?
851 名前:デフォルトの名無しさん (ワッチョイ 336e-8FG5) mailto:sabe [2017/03/22(水) 20:35:57.13 ID:i8R0t7KQ0.net] お前ら意地悪だな VisualStudioならプログラム終了時にすべてのメモリが解放されたか チェックしてくれるDebug版お便利mallocがあるだろ _CrtSetDbgFlag で検索してみるとよい あと、ヒープ破壊を心配しているようだが Debug版mallocにはヒープ破壊検出機能もついてる もしオーバーランしていたりしたらfree時に怒られる
852 名前:デフォルトの名無しさん (ワッチョイ cf1f-9jmm) [2017/03/22(水) 20:36:51.91 ID:0C1B3gPp0.net] これとか LinuxC | GC メモリ周りの基本的操作とテクニック Boehm GC 問題のあるプログラム #include <stdio.h> #include <stdlib.h> void memory_test(void){ char *p; p = malloc(1024); } int main(void){ memory_test(); return 0; } 実行するとエラーも出ず問題なく実行できます。 これは当然で、プログラム終了時にはOSがすべての資源(メモリやファイルディスクリプタ等)はすべて回収してくれるからです。 しかしこれは問題です。 Boehm GCの基本的な使い方 ではこのプログラムでBoehm GCを使います。 Boehm GCはmalloc(3)、realloc(3)の代わりにGC_malloc(),GC_malloc_atomic(),GC_realloc()を使います。 malloc(3)、reallc(3)、free(3)をそれぞれ置き換える作業だけです。 linuxc.info/memory/gc/
853 名前:デフォルトの名無しさん (ワッチョイ 3392-8YZg) mailto:sage [2017/03/22(水) 20:37:32.91 ID:dqBQr4XV0.net] >>827 可愛らしいな聞いたことない >>829 dllの呼び方間違えてるとは? 呼び出すドライバについては片っ端からのfreeはちゃんとしてあるぜ 新しい環境については会社での統一環境だから移行できんな...
854 名前:デフォルトの名無しさん (ワッチョイ 3392-8YZg) mailto:sage [2017/03/22(水) 20:41:03.02 ID:dqBQr4XV0.net] >>831 ちょっと調べてみる 一応確認だけどもdll呼び出すドライバの最後にちょろっとやればええんかな >>832 なんぞこれ
855 名前:デフォルトの名無しさん (ワッチョイ bf67-lir9) mailto:sage [2017/03/22(水) 20:41:15.04 ID:rzLKjPpj0.net] dllのソースもってるのかな?
856 名前:デフォルトの名無しさん (ワッチョイ 336e-8FG5) mailto:sage [2017/03/22(水) 20:45:10.10 ID:i8R0t7KQ0.net] ああ、dllのソースがないとだめだよ dllのソースがないのにメモリリークが有るか無いかしらべるのは さすがにムリゲーだよ
857 名前:デフォルトの名無しさん (ワッチョイ 3392-8YZg) mailto:sage [2017/03/22(水) 20:45:12.77 ID:dqBQr4XV0.net] >>835 持ってる むしろそのdllを今書き換えてるところかな んでテストする段階で悩んでるところです
858 名前:デフォルトの名無しさん (ワッチョイ f3c8-tpgq) mailto:sage [2017/03/22(水) 21:00:54.62 ID:E1Td5RgZ0.net] >>837 とりあえず仮定を確認しよう。 1. dll以外の部分では今のところリークしていない 2. dllと組み合わせるとリークする んだよな? そして書き換えているのは本体ではなく、dllなのか? (これは俺の想定と逆だった) だったらお前がバグ入れただけじゃん。
859 名前:デフォルトの名無しさん (ワッチョイ 3392-8YZg) mailto:sage [2017/03/22(水) 21:06:53.51 ID:dqBQr4XV0.net] >>838 1 2 両方とも正しい んでもって俺が加えたのは型を修正しただけだからたぶん関係ない と言うか関係ない おそらく以前からある現象で以前のdllを利用しても同じ感じになる 2については組み合わせるとと言うよりテストのための実行ファイルを適当に作っただけかな 今回触れてない部分が大半なんだけどバージョンアップするから メモリ破壊なりも調べる観点が必用で umdhやらcrtデバッグやらページヒープやら調べてるんだけど...ってところ
860 名前:デフォルトの名無しさん (ワッチョイ cf1f-9jmm) [2017/03/22(水) 21:34:34.94 ID:0C1B3gPp0.net] Boehm GCはオールCのはずでwindowsでもその他でも動作するし昔から定番だったはず。 だれもこれだしてないが・・
861 名前:デフォルトの名無しさん (ワッチョイ 5375-gO1F) [2017/03/22(水) 21:38:38.83 ID:sj71GTBZ0.net] Linux上でWine+valgrindやろ やったこと無いけど。
862 名前:デフォルトの名無しさん (ワッチョイ f3c8-tpgq) mailto:sage [2017/03/22(水) 22:27:39.33 ID:E1Td5RgZ0.net] >>839 それは業務でやってるんだろ? だったらまず、「以前の本体と以前のdllの組み合わせで、今のテスト」を行って、 リークしているようなら上司にどうするか聞いた方がいい。 このリークを直せというのは確実に手こずる。 そして逆に言えば、今それで出荷出来ているんならそれでも使い物になるんだよ。 だからリークがある状態で新機能付けて出荷も出来るはず。 ちなみに64bitアプリか?だったらリークはとりあえず無視する手もあるぞ。
863 名前:デフォルトの名無しさん (ワッチョイ bf67-lir9) mailto:sage [2017/03/22(水) 23:03:40.64 ID:rzLKjPpj0.net] 期末のこの時期に、メモリリーク。。こわい。。 UMDH調べてるなら、方向はいいとおもうけど。 上に、あげといた方がいいだろな。 時間食うかもしれん。 メモリ壊してると、動作不定になるからな。
864 名前:デフォルトの名無しさん (ワッチョイ 63b7-rEFK) mailto:sage [2017/03/23(木) 00:17:11.61 ID:oAoB0YCS0.net] ttps://vld.codeplex.com なんかで調べてたときはこれ使ってたな。 めちゃくちゃ遅くなるけど。
865 名前:デフォルトの名無しさん (ブーイモ MM4a-TrMc) mailto:sage [2017/03/23(木) 03:06:19.64 ID:52JJY4k+M.net] >>839 バグ修正は「おそらく」「たぶん」とかいう自信のない根拠を持たずに チマチマ地道に調べて積み重ねると早く解決するよ