[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 10/30 03:13 / Filesize : 322 KB / Number-of Response : 1026
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part129



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言語あるあるだから
要するにバグの顕在化って奴ね
なのでコンパイラ替えたら一通りテストした方がいい






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<322KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef