[表示 : 全て 最新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

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
バグ修正は「おそらく」「たぶん」とかいう自信のない根拠を持たずに
チマチマ地道に調べて積み重ねると早く解決するよ






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

前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