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
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 バグ修正は「おそらく」「たぶん」とかいう自信のない根拠を持たずに チマチマ地道に調べて積み重ねると早く解決するよ
866 名前:デフォルトの名無しさん (ワッチョイ 9375-iMo4) [2017/03/23(木) 03:37:19.31 ID:mYb1ScGd0.net] Linuxでも動かせるならvalgrindが最も簡単かつ実効速度以外最強なんだけどね。 Windowsのメモリエラー検出ツールはコレっていうのがない。
867 名前:デフォルトの名無しさん (ドコグロ MMe2-hXJm) mailto:sage [2017/03/23(木) 06:43:06.01 ID:HovpjxiMM.net] valgrind なんてオープンソースだから誰かが Windows にポーティングしてるかと思ったら Windows is not under consideration because porting to it would require so many changes it would almost be a separate project. (However, Valgrind + Wine can be made to work with some effort.) ということなのね、残念
868 名前:デフォルトの名無しさん (スプッッ Sde3-2Cpe) mailto:sage [2017/03/23(木) 07:14:51.92 ID:ne+fmuh4d.net] >>842 後だしばかりですまんが32→64bitアプリへの移行中 64bitにしたさいにメモリ破壊なりがないかを確認するためにumdhやらを使おうってなってる あくまでリークしてるかも?ってのは俺がタスクマネージャー見ただけでの予測である
869 名前:デフォルトの名無しさん (スプッッ Sde3-2Cpe) mailto:sage [2017/03/23(木) 07:19:49.58 ID:ne+fmuh4d.net] おお...途中で送ってしまった >>845 それはわかってるんだけどどうにしろ 移行した影響があるかないかも含めて確認するために必要なこととしてツールで保証したいってのがある んで調査中でオススメのないかな?←今ここ ページヒープってのを見付けたんだがあからさまにメモリ破壊してるやつでも検出できないしこれ使ってる人居たら何に対応できるか教えてくれんか....
870 名前:デフォルトの名無しさん (ワッチョイ fe1f-sIi0) [2017/03/23(木) 08:52:11.56 ID:UkDqG0iw0.net] ソースコードがあるなら汎用的なBoehm GCでいいだろうと
871 名前:デフォルトの名無しさん (ワッチョイ 9375-iMo4) [2017/03/23(木) 09:19:11.19 ID:mYb1ScGd0.net] 俺はつかったことないけど dynamorio.org とか 金出せるなら Insure++ってやつとか >>850 メモリリークしか検出出来ないでしょ
872 名前:デフォルトの名無しさん (ワッチョイ aa67-QN42) mailto:sage [2017/03/23(木) 09:23:00.74 ID:63eMbsST0.net] >>849 ツールで保証したい っていうなら、>>850 が正しいかと。。
873 名前:e-72yv) mailto:sage [2017/03/23(木) 13:57:08.14 ID:FwJwtm3q0.net] ツールでメモリリークがないことを保証したいってだけなら VC++のランタイム付属のやつで十分だろ メモリ破壊が有ったかどうかも調べてくれるし こういったものが標準でついていて みんな空気のように標準的に使っているから 実際問題メモリリークはめったに起きないんだよ もしあったらプログラム終了時に教えてくれるからね だからメモリリークに対してはそんなに騒がれない 付属のやつで十分な品質を保証できるから たまーにしか通らないパスでメモリリークが発生していた場合など メモリリークの発見が遅れることはあるけど まぁ通ってないパスがある時点でテストが十分でないということだし 一か月に一回ほどの頻度でメモリリークするぐらいは別に問題ないという考え方もある ・・・っていうのもあって、まぁ付属の検出ツールで大体の品質は出る それよりはハンドルやGDIなどのOSリソースのリークが怖くて こちらは如何なるツールを使っても検出不可能で タスクマネージャなどで変にハンドルが増えてないかなど 地道に調べるしか方法がない だからハンドルなどは生で使わずにクラスにラップして使うのが通常だが 題意のDLLがどういう風になっているかは俺は知らん もしリークが発生してしまったらメモリリークより深刻な事態になる メモリよりもOSのリソースの方が貴重で制限が厳しいから むしろこっちのほうを気にすればよいのにと思ってしまう メモリリーク対策などVC++付属のやつに任せてしまってさ
874 名前:デフォルトの名無しさん (ワッチョイ be6b-72yv) [2017/03/23(木) 14:02:35.67 ID:xx3Et9SY0.net] ツールに依存しきって分岐網羅とかやらなくなってるとしたら それはツールによって腐ったとしか言いようがない
875 名前:デフォルトの名無しさん (ワッチョイ 2b6e-72yv) mailto:sage [2017/03/23(木) 14:11:13.36 ID:FwJwtm3q0.net] ちなみにリソースリークが発生していて 結果としてメモリ使用量がどんどん増えていくってのは有りうるよ タスクマネージャで調べたら使用メモリが増えていってる感じだったってことだけど それだけだと何が原因か、はたまた問題ないのか、難しいよ メモリ使用量を見るだけじゃダメで、ハンドル使用量etcも確認しないとね これはマナーとしてWindowsソフト開発者は絶対するよ リソースリークなんかしてたらむちゃくちゃ恥ずかしいし迷惑だから あと、リソースリークはメモリリーク検出ツールでは検出できないからね それから、もしリソースリークが発生していることが分かっても どこで発生しているか突き止めるのはメモリリーク以上に難しい、とは言っておく
876 名前:デフォルトの名無しさん (ワッチョイ 2b6e-72yv) mailto:sage [2017/03/23(木) 14:26:25.40 ID:FwJwtm3q0.net] テストを走らせるときにVC++のメモリリーク検出機能をONにしておくと テスト終了時にメモリリークが発生したかどうか知らせてくれるというだけで メモリリーク検出ツールを使うことと テストの網羅が不十分なこととは関連性がないよ メモリリーク検出ツールを使ったから、何か油断して テストの網羅が不十分になるっていう理論の展開は 一般的におこらないというか、無理がある むしろテストを網羅しないとメモリリークを検出できないわけで
877 名前:デフォルトの名無しさん (ワッチョイ 9375-iMo4) [2017/03/23(木) 14:28:17.35 ID:mYb1ScGd0.net] valgrindではunixシステムの主要リソースであるfile descriptorのリークも検出出来るけどな
878 名前:デフォルトの名無しさん (ワッチョイ be6b-72yv) [2017/03/23(木) 14:29:11.39 ID:xx3Et9SY0.net] おまえさっき、こう言ってたじゃん > たまーにしか通らないパスでメモリリークが発生していた場合など > メモリリークの発見が遅れることはあるけど
879 名前:デフォルトの名無しさん (ワッチョイ 2b6e-72yv) mailto:sage [2017/03/23(木) 14:43:08.69 ID:FwJwtm3q0.net] それはテストが不十分ゆえに発生した問題であって メモリリーク検出ツールを使った事とは全く関係がない >まぁ通ってないパスがある時点でテストが十分でないということだし と書いておいただろ
880 名前:デフォルトの名無しさん (スプッッ Sdea-QN42) mailto:sage [2017/03/23(木) 15:03:37.80 ID:ixe949V5d.net] 無いことを保証するってのは、こわい文言だね。 dll内で、メモリ確保、解放してるところを、共通の関数に置き換えて、その上で、gcにおきかえかなぁ。
881 名前:デフォルトの名無しさん (ワッチョイ be6b-72yv) [2017/03/23(木) 15:45:13.38 ID:xx3Et9SY0.net] >>859 関係大ありだよ 通ってないパスのバグが検出できないツールを使っているのに たまーにしか通らないパスをテストしないのは ツールを過信してる証拠だろうが
882 名前:デフォルトの名無しさん (ワッチョイ 2b6e-72yv) mailto:sage [2017/03/23(木) 16:33:59.49 ID:FwJwtm3q0.net] いや、意味不明なんだが 通ってないパスのメモリリークが検出できないのは当たり前で そんな変な勘違いする人はいないし テストの網羅度が下がる理由はもっと別要因の別問題の別観点であり メモリリーク検出ツールを過信したからとか意味不明 「俺はメモリリーク検出ツールを使っているからテストの網羅度が低くてもOKだぜ」 ってシナリオがもうありえないっつーか、前提がおかしいだろ メモリリークしかテストしないかのような前提はおかしい メモリリークさえなければ出力が間違っててもOK、とはならないだろ となれば当然テストするだろ、リーク検出ツールの有無に関係なく むしろ、リークの有る無しより、出力のほうが大事だろ、そっち優先 そのためのテストであり、パスの網羅度が高ければ結果的にリーク検出度も高いというだけ どのぐらい完璧なテストをするか、すべてのパスを網羅できるか、は メモリリーク検出ツールを使うかどうかとは関係ない、また別の現実問題
883 名前:デフォルトの名無しさん (スプッッ Sdea-QN42) mailto:sage [2017/03/23(木) 16:44:15.11 ID:ixe949V5d.net] お、おまいら、そうおこるなよ。 >849 から、つづきもないし、上手く行っていることを祈ろう。
884 名前:デフォルトの名無しさん (ワッチョイ be6b-72yv) [2017/03/23(木) 17:00:53.12 ID:xx3Et9SY0.net] > 通ってないパスのメモリリークが検出できないのは当たり前で だったらツールでは防げないバグの話にツールを持ち出すこと自体が大間違いだな
885 名前:デフォルトの名無しさん (ワッチョイ 2b6e-72yv) mailto:sage [2017/03/23(木) 17:33:17.98 ID:FwJwtm3q0.net] ツールで防げないバグってのは 一度も通ったことのないパスのメモリリークの事を指しているんだろうけど それをどうにかしてほしいって話は無かったはずだが、どっから出てきたんだ? そんな話してたか? リーク検出ツールを使ってもテストの網羅度が完璧じゃなくて漏れてしまうこともある「が」 それでも一定の効果はあるので有用である という話はしたが テストのパスの網羅度が不十分で漏れてしまうメモリリークバグを ツールでどうにかする、とは俺は言ってないんだが、初めからな
886 名前:デフォルトの名無しさん (ササクッテロル Spd3-yqOs) mailto:sage [2017/03/23(木) 17:35:51.53 ID:argEiYvxp.net] >>853 読んでそんなトンチンカンな理解をする方が大間違いだろう メモリリークが大して騒がれない、ってことに対するオマケの補足情報にどんだけ突っかかるんだ
887 名前:デフォルトの名無しさん (ワッチョイ be6b-72yv) [2017/03/23(木) 18:00:16.89 ID:xx3Et9SY0.net] おまえ853で開口一番こう言ったぞ > ツールでメモリリークがないことを保証したいってだけなら > VC++のランタイム付属のやつで十分だろ どっから出てきたって、おまえの口からだよ
888 名前:デフォルトの名無しさん (スッップ Sd4a-ejJz) [2017/03/23(木) 18:26:51.25 ID:pJ6fwoOxd.net] また言った言わないの揚げ足取り合戦かよくだらねえ
889 名前:デフォルトの名無しさん (ワッチョイ be6b-72yv) [2017/03/23(木) 18:34:26.25 ID:xx3Et9SY0.net] 話の本題を無視して言葉尻にだけ突っかかる誰かさんのようなのを揚げ足取りというんだよ
890 名前:デフォルトの名無しさん (スプッッ Sde3-2Cpe) mailto:sage [2017/03/23(木) 18:54:08.36 ID:ne+fmuh4d.net] >>863 ありがとう とりあえずでboehmでメモリリーク監視することになった 思いきりリークしてるみたいだからどうしようかと悩むが... 別件なのだけどvc6環境のC++とvc9環境のC++で差分の出る演算ってあるかな? for文のスコープの範囲が変わるぐらいしかわからんくて 大きな演算の違いはないのだろうけどもそれぞれの環境でのモジュールで 本当に微々たる差が出ているみたいで... 基本的には結果に差分がなく、特定のパラメータファイルの時だけ差分が出てしまう。その差も30mb中の0.1%も満たないぐらい やってることとしてはvc6→vc9環境へプロジェクトファイルの移行
891 名前:デフォルトの名無しさん (スプッッ Sde3-2Cpe) mailto:sage [2017/03/23(木) 19:11:57.84 ID:ne+fmuh4d.net] パラメータファイルって書くと設定値みたいに見えるね 特徴抽出したやつに演算かけてます
892 名前:デフォルトの名無しさん (ワッチョイ 1bc8-VHv+) mailto:sage [2017/03/23(木) 19:20:15.49 ID:Ei+8urX30.net] >>848 32→64bit移行の安全性を実行時ツールで検出、というのはかなり無理じゃないか? だからみんなソースコードをチェックしているわけだし。 sgry.jp/pgarticles/64.html yukinarit.blog11.fc2.com/blog-entry-27.html qiita.com/izmktr/items/59085ca70a6c11b0b352 >>870 > 思いきりリークしてるみたいだからどうしようかと悩むが... 32→64bit移行ではリーク自体は発生しないぞ。 それは結果的に症状がリークなだけで、根本的に駄目なところがあるんだよ。 まずは32bitの旧バイナリと新テストパターンで足場を固めないと駄目だと思うぞ。 数値演算結果の誤差ならSSEとx87の精度の違いかもしれん。 ただしVC9(VS2008)は演算にはSSEを出せなかったはずだから関係ないとは思うが。
893 名前:デフォルトの名無しさん (スプッッ Sde3-2Cpe) mailto:sage [2017/03/23(木) 19:36:37.57 ID:ne+fmuh4d.net] >>872 長々とサンクス 思いきりリークしてるから..ってのは元々からリークしていただろうから 対処をどうしようか悩むなぁって意味でした SSEとx87についてちょっと調べてくる
894 名前:デフォルトの名無しさん (ワッチョイ 7b7a-7HKf) mailto:sage [2017/03/23(木) 19:50:33.67 ID:CpsZOT5F0.net] 浮動小数点の丸めモードが違うとかあるか?
895 名前:デフォルトの名無しさん (ドコグロ MMe2-7Y/j) mailto:sage [2017/03/23(木) 20:04:25.70 ID:8W2HqVqhM.net] >>870 vc6って標準準拠してたっけ? c++のような何かだったような気がするけど。
896 名前: ◆QZaw55cn4c (ワッチョイ a6ff-nbIt) mailto:sage [2017/03/23(木) 20:26:53.12 ID:qM4EW3hi0.net] >>870 ベームGCか,なかなか息がながいライブラリだね
897 名前:デフォルトの名無しさん (ワッチョイ 7b7a-7HKf) mailto:sage [2017/03/23(木) 20:32:55.87 ID:CpsZOT5F0.net] >>875 当時は標準規格というもの自体が無かった
898 名前:デフォルトの名無しさん (ワッチョイ 1bc8-VHv+) mailto:sage [2017/03/23(木) 20:37:31.58 ID:Ei+8urX30.net] >>873 あと、FMACの最適化がどこかであったはず。 (ただしググッても出てこないので、俺がGPUの話と混同して勘違いしているだけかも) 内容は、FMACの中間結果を精度が高い状態で保持しておき、FADDに突っ込むというもの。 これに該当した場合は、結果がハードウェア依存になる。 (旧ハードと新ハードでFMACの結果が微妙に異なる) だから同一ハードでの新旧バイナリでの結果をdiffしているのなら、これは該当しない。 環境移行が面倒等で、旧マシンで結果だけ作って新マシンと比べている場合、当たるかもしれない。 ただし再度言うが、GPUの話だったかもしれんのでよろしく。
899 名前:デフォルトの名無しさん (ドコグロ MMe2-hXJm) mailto:sage [2017/03/23(木) 20:40:17.12 ID:HovpjxiMM.net] >>870 > 別件なのだけどvc6環境のC++とvc9環境のC++で差分の出る演算ってあるかな? 正しいプログラムだとそんなに変更はないと思うけど、例えば引数の評価順に依存しているプログラムの動きが変わるって言うのはC言語あるあるだから 要するにバグの顕在化って奴ね なのでコンパイラ替えたら一通りテストした方がいい