GC、ガベージコレクション、ガベージコレクタ、ガーベジコレクション、ガーベジコレクタは使えない。
以下GCと記す
プログラマをメモリ管理から開放する!
といいつつ、メモリリーク問題の文献が大量にある。
これすなわち、メモリリーク問題が全然解決していないということ。
さらに、メモリ解放のタイミングの文献まで大量に生み出した。
これすなわち、新たなるメモリ管理に関する問題を生み出したということ。
malloc、freeじゃないが
結局のところ、メモリを管理するという技術は、今しばらくは、身につける・教える・学ぶべきではないだろうか?
使って、そのまま放置しても、基本的にはGCがなんとかしてくれている。
ランジョブからジョブ終了までさほどの時間を要さない。メモリも大して使わないならいいだろう。
しかし、規模が大きくなり常駐ジョブやメモリ大量使用のジョブになってくると、そんなメモリ管理の方法でやっていると、
上記「文献」を生み出されてしまう。
入門時は、メモリに無頓着でもいいだろう。それよりも、目的を達成することが先決だ。
しかし、慣れてきたら、やはりメモリの管理まで余裕を持って自分で行うべきだろう。
前スレ
GCは失敗。メモリは自分で管理せよ!
http://peace.2ch.net/test/read.cgi/tech/1412986420/
GCは失敗。メモリは自分で管理せよ! その2©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2015/11/18(水) 23:24:59.79ID:BUQ68wTG
184デフォルトの名無しさん
2015/12/05(土) 15:50:01.56ID:9PUwCRa0 >>183
C++にはテンプレートがあるからリソースの型をテンプレート引数とするラッパーを作るのは
そんなに面倒なことじゃないと思う
あとC++でRAIIを徹底してればfainallyの必要性を感じたことはない
fainallyを書かなければいけない時点で危なっかしいコードだと思う
C++にはテンプレートがあるからリソースの型をテンプレート引数とするラッパーを作るのは
そんなに面倒なことじゃないと思う
あとC++でRAIIを徹底してればfainallyの必要性を感じたことはない
fainallyを書かなければいけない時点で危なっかしいコードだと思う
185デフォルトの名無しさん
2015/12/05(土) 16:34:34.82ID:+HxrBEdK むしろfinallyってデストラクタがない言語だから
必要なものなんじゃ…
どうしても必要ならデストラクタで任意のラムダ呼ぶ
ユーティリティクラス作れば同じこと出来るし
必要なものなんじゃ…
どうしても必要ならデストラクタで任意のラムダ呼ぶ
ユーティリティクラス作れば同じこと出来るし
186デフォルトの名無しさん
2015/12/05(土) 16:50:13.74ID:+HxrBEdK 98以前でもローカルクラス定義できるんだからすこし冗長なだけで同じだし
187デフォルトの名無しさん
2015/12/05(土) 16:59:06.52ID:NRX1k+Is 例外発生はバグ、というプログラミングしかしたことないからよくは知らんが、
try {
try {
/*...*/
} catch (std::badalloc()) {
/*...*/
} catch (UserException e) {
/*...*/
}
} catch (...) { // fainally節の代わり
/*...*/
}
じゃあいかんの?実行時コストは知らん
try {
try {
/*...*/
} catch (std::badalloc()) {
/*...*/
} catch (UserException e) {
/*...*/
}
} catch (...) { // fainally節の代わり
/*...*/
}
じゃあいかんの?実行時コストは知らん
188デフォルトの名無しさん
2015/12/05(土) 17:00:08.66ID:NRX1k+Is スマン
誤: } catch (std::badalloc()) {
正: } catch (std::badalloc e) {
誤: } catch (std::badalloc()) {
正: } catch (std::badalloc e) {
189デフォルトの名無しさん
2015/12/05(土) 17:32:52.06ID:+HxrBEdK 違う。そんぐらいググれ
190デフォルトの名無しさん
2015/12/05(土) 17:37:26.87ID:KdBqlpoa デストラクタの問題点は不可視なところだな
usingやfinallyは目に見えるから安心する
usingやfinallyは目に見えるから安心する
191デフォルトの名無しさん
2015/12/05(土) 18:00:14.20ID:NRX1k+Is192デフォルトの名無しさん
2015/12/05(土) 18:22:16.37ID:0v99S3Ys 例外をロジックとして使うなってばっちゃんが言ってた
193デフォルトの名無しさん
2015/12/05(土) 19:38:41.80ID:eGerJrSR >>191
throwせずにreturnするパスが有ったらどうするんだよ
そういうのを防ぐためのfinallyやRAIIなのに
まったくちんぷんかんぷん
結局returnする前に手動で忘れないようにthrowすることを強制するんなら
goto文とか開放用ラムダ呼び出すのとかと替わらないだろ
throwせずにreturnするパスが有ったらどうするんだよ
そういうのを防ぐためのfinallyやRAIIなのに
まったくちんぷんかんぷん
結局returnする前に手動で忘れないようにthrowすることを強制するんなら
goto文とか開放用ラムダ呼び出すのとかと替わらないだろ
194デフォルトの名無しさん
2015/12/05(土) 20:44:27.97ID:ZNw2R9x1 だから忘れる忘れないレベルをぶち込んでくるのは止めようやw
これをぶち込むから全ての議論が池沼レベルになってる
これをぶち込むから全ての議論が池沼レベルになってる
195デフォルトの名無しさん
2015/12/06(日) 06:02:02.37ID:JYyEEHci 異常系で例外返す仕様のライブラリが失敗。
196デフォルトの名無しさん
2015/12/06(日) 08:06:42.75ID:XhferEg+197デフォルトの名無しさん
2015/12/06(日) 11:36:02.06ID:G3VNQyn5 c++のデストラクタって後処理に失敗しても
例外投げられないからウンコ
結果的にエラーを握り潰すゴミコードを量産する原因になってる
例外投げられないからウンコ
結果的にエラーを握り潰すゴミコードを量産する原因になってる
198デフォルトの名無しさん
2015/12/06(日) 11:40:47.08ID:zGnP2wpv そのクラスが管理してる範囲で後処理の失敗って何が起こるの?
199デフォルトの名無しさん
2015/12/06(日) 12:05:41.69ID:kVHO13oj どうしてもやりたいなら対処法はあるしなぁ。
200デフォルトの名無しさん
2015/12/06(日) 12:23:19.67ID:MkaxAbH2 現実的な確率で発生して無視出来ないリスクが有る解放処理はデストラクタでやるべきじゃない
そういうリソースに対してデストラクタがやる事はプログラマに対しいて未解放のリソースを通知する事だけでよい
そういうリソースに対してデストラクタがやる事はプログラマに対しいて未解放のリソースを通知する事だけでよい
201デフォルトの名無しさん
2015/12/06(日) 12:30:12.96ID:XhferEg+ 具体的に何があるん???
クラス内で使っているリソースで解放に失敗(失敗し続ける)するって。
クラス内で使っているリソースで解放に失敗(失敗し続ける)するって。
202デフォルトの名無しさん
2015/12/06(日) 13:14:17.95ID:lk97yytv どっか他のオブジェクトと共有してるものを解放しようとして失敗するとか?
それはそもそもの設計に問題ありすぎだが。。
それはそもそもの設計に問題ありすぎだが。。
203デフォルトの名無しさん
2015/12/06(日) 15:01:28.77ID:XhferEg+ >>202
だよね。
否定しようとして無理やり現象を創りだそうとしているとしか・・・。
でもその無理やりつくった現象は、そもそも論理設計のミスが大前提だったりする。
論理設計のミスまで言われたらなんにも組めないわ。
だよね。
否定しようとして無理やり現象を創りだそうとしているとしか・・・。
でもその無理やりつくった現象は、そもそも論理設計のミスが大前提だったりする。
論理設計のミスまで言われたらなんにも組めないわ。
204デフォルトの名無しさん
2015/12/06(日) 15:42:32.97ID:wxELMJDc >>200
デストラクタの中で起きた例外については
try { } catch (...) { }で囲った上で、リカバリ処理(何とかしてリソース解法漏れをなくす)を行えばいいじゃない?
もし例外発生後に行うべき適切なリカバリ処理が書けない(存在しない)んだとすると、
もはやデストラクタ内に限った話ではなくなって、例外を発生させた時点で設計か実装にバグが居たとしか…
デストラクタの中で起きた例外については
try { } catch (...) { }で囲った上で、リカバリ処理(何とかしてリソース解法漏れをなくす)を行えばいいじゃない?
もし例外発生後に行うべき適切なリカバリ処理が書けない(存在しない)んだとすると、
もはやデストラクタ内に限った話ではなくなって、例外を発生させた時点で設計か実装にバグが居たとしか…
205デフォルトの名無しさん
2015/12/06(日) 16:03:58.23ID:5cQQ9Lrm バグ(リソースへのポインタやハンドルを壊しちゃったとか)以外で
リソース解放に失敗するケースなんて1つも思いつかない
リソース解放に失敗するケースなんて1つも思いつかない
207デフォルトの名無しさん
2015/12/06(日) 16:54:30.29ID:djRjUyAt fflush() しとけばOK
208デフォルトの名無しさん
2015/12/06(日) 16:59:21.77ID:5cQQ9Lrm >>206
fcloseの失敗はハンドルが正しい限りflush時のI/Oエラーの通知であって、その場合でもリソースは解放されるよ
fcloseの失敗はハンドルが正しい限りflush時のI/Oエラーの通知であって、その場合でもリソースは解放されるよ
209デフォルトの名無しさん
2015/12/06(日) 17:35:51.31ID:G3VNQyn5210デフォルトの名無しさん
2015/12/06(日) 17:44:16.50ID:G3VNQyn5 fcloseに失敗してファイルに正常に書き込みされなくてもシカトしてるんだよね?
それともerrnoとかチェックしちゃってるの?
それともerrnoとかチェックしちゃってるの?
211デフォルトの名無しさん
2015/12/06(日) 19:05:12.47ID:RyqEmv/A まあC++の例外を援護するつもりはないがそういう場合は
普通にフラッシュしろよ
そもそもC++が二重例外時にstd::terminate呼ぶのはGCのあるなしに
関係ないからスレ違いだお前ら。よそでやれ
普通にフラッシュしろよ
そもそもC++が二重例外時にstd::terminate呼ぶのはGCのあるなしに
関係ないからスレ違いだお前ら。よそでやれ
212デフォルトの名無しさん
2015/12/06(日) 19:24:21.60ID:XJADMoL5 GCというよりライブラリとの関係だな
.net framework libraryのいくつかのクラスは中で自分自身をロックするから
プログラマ側で参照が切れてもGCされない
.net framework libraryのいくつかのクラスは中で自分自身をロックするから
プログラマ側で参照が切れてもGCされない
213デフォルトの名無しさん
2015/12/06(日) 19:25:02.74ID:XJADMoL5 今日一日なんでFormがGCされないのか調べてて大変な思いしたわ
214デフォルトの名無しさん
2015/12/06(日) 19:31:56.53ID:bkfT5adp >>213
よくそこまで調べたな。( ・∀・)つ旦 お茶ドゾー
よくそこまで調べたな。( ・∀・)つ旦 お茶ドゾー
215デフォルトの名無しさん
2015/12/06(日) 19:37:02.30ID:Gxx7TgqC いまだにプログラマはアセンブリ言語を使えるべきだ派?
216デフォルトの名無しさん
2015/12/06(日) 19:40:49.58ID:JYyEEHci アセンブラ知ってると知らないとじゃスキルレベル全然違うからな。話にならないぐらいのレベル差。
217デフォルトの名無しさん
2015/12/06(日) 20:22:00.43ID:RyqEmv/A まあ実際Java屋とかってコンパイラやメモリ意識できない奴多いよね
以前2chで↓みたいなコードが勝手に最適化されると思って
StringBuilder使う奴は馬鹿!とか言い出す奴いて目眩したわ
String s;
for(int i = 0; i < strarray.length; ++i){ s += strarray[i]; }
以前2chで↓みたいなコードが勝手に最適化されると思って
StringBuilder使う奴は馬鹿!とか言い出す奴いて目眩したわ
String s;
for(int i = 0; i < strarray.length; ++i){ s += strarray[i]; }
218デフォルトの名無しさん
2015/12/06(日) 20:58:14.61ID:wxELMJDc >>217
それはStringの+=の実装次第ではあんまり差が付かないケースなんじゃ…
(左辺と右辺が別の実体である(アドレスが違う)ケースでは多分右辺を左辺の末尾に1回コピーするだけという実装が有り得る
真に糞なのは
StringBuilder sb;
String s = "Hello";
sb.Append("[" + s + "]");
が遅いからStringBuilderは糞、と結論付けるニンゲンであってコードではない、
みたいな?
それはStringの+=の実装次第ではあんまり差が付かないケースなんじゃ…
(左辺と右辺が別の実体である(アドレスが違う)ケースでは多分右辺を左辺の末尾に1回コピーするだけという実装が有り得る
真に糞なのは
StringBuilder sb;
String s = "Hello";
sb.Append("[" + s + "]");
が遅いからStringBuilderは糞、と結論付けるニンゲンであってコードではない、
みたいな?
219デフォルトの名無しさん
2015/12/06(日) 21:26:17.35ID:IAFYzi6n >>217みたいにループ中で一個づつくっつける場合は別にして
s = a + b + c + d; // このように、高々数個をくっつけてる場合は
Javaだと無駄にStringBufferが作られてダメと言うのが定説だったが
C#の場合は内部的にString#Concatに置き換えられて
それによって
StringBuilder b = 略
s = a.Append(b)中略.Append(d).ToString()
するより早い、という話題があってそれと勘違いしたのかもね
s = a + b + c + d; // このように、高々数個をくっつけてる場合は
Javaだと無駄にStringBufferが作られてダメと言うのが定説だったが
C#の場合は内部的にString#Concatに置き換えられて
それによって
StringBuilder b = 略
s = a.Append(b)中略.Append(d).ToString()
するより早い、という話題があってそれと勘違いしたのかもね
220デフォルトの名無しさん
2015/12/06(日) 21:28:20.04ID:IAFYzi6n いちおう訂正しとこw
StringBuilder sb = 略
s = sb.Append(a)中略.Append(d).ToString()
StringBuilder sb = 略
s = sb.Append(a)中略.Append(d).ToString()
221デフォルトの名無しさん
2015/12/06(日) 21:50:20.98ID:MkaxAbH2 そもそもその最適化は仕様なのか
222デフォルトの名無しさん
2015/12/06(日) 22:27:08.91ID:RyqEmv/A223デフォルトの名無しさん
2015/12/07(月) 01:50:02.58ID:3Z+aJEnB >>222
実装云々でなんで演算子オーバーロードがでてくるんだ?
実装云々でなんで演算子オーバーロードがでてくるんだ?
224デフォルトの名無しさん
2015/12/07(月) 05:22:13.32ID:QznWTKRS 逆だろ?
C#との勘違いでないなら、その最適化されるJVM実装とやらを示さないと
C#との勘違いでないなら、その最適化されるJVM実装とやらを示さないと
225デフォルトの名無しさん
2015/12/07(月) 07:11:57.22ID:X5Y+ON7N >>219
全く逆の認識してないか?
classファイル解析したら分かるけど、ループ中の+=の方が問題で毎回newされるから遅い
s = a + b + c + d の方は一つしかStringBuilderのインスタンスは作られない
全く逆の認識してないか?
classファイル解析したら分かるけど、ループ中の+=の方が問題で毎回newされるから遅い
s = a + b + c + d の方は一つしかStringBuilderのインスタンスは作られない
226デフォルトの名無しさん
2015/12/07(月) 08:02:18.14ID:nEG5/lEo こうやって、比較的プログラミングという行為を好きでいる・好きでやっている・興味を持っているという人ですらまともに言語仕様を理解出来ていない。
malloc、freeで管理、GCで管理だと、機構の複雑さは後者。
結局GCもその機構を正しく理解しないと参照が切れてない、参照が切れていても別のリソースが・・・と。
機構を正しく理解していることが前提なら、機構はシンプルなほうがいい。
その点を誤ったから
>プログラマをメモリ管理から開放する!
>といいつつ、メモリリーク問題の文献が大量にある。
>これすなわち、メモリリーク問題が全然解決していないということ。
>さらに、メモリ解放のタイミングの文献まで大量に生み出した。
>これすなわち、新たなるメモリ管理に関する問題を生み出したということ。
なんてことになったんだろうね
malloc、freeで管理、GCで管理だと、機構の複雑さは後者。
結局GCもその機構を正しく理解しないと参照が切れてない、参照が切れていても別のリソースが・・・と。
機構を正しく理解していることが前提なら、機構はシンプルなほうがいい。
その点を誤ったから
>プログラマをメモリ管理から開放する!
>といいつつ、メモリリーク問題の文献が大量にある。
>これすなわち、メモリリーク問題が全然解決していないということ。
>さらに、メモリ解放のタイミングの文献まで大量に生み出した。
>これすなわち、新たなるメモリ管理に関する問題を生み出したということ。
なんてことになったんだろうね
227デフォルトの名無しさん
2015/12/07(月) 08:12:44.70ID:EA/TwAsy そもそもプログラマの大半にマネージリソース、アンマネージリソースとはなに?
って質問してまともに回答できる割合がどんなもんになるのか
始めたら終わらせる
これワンセットね
にしたほうがミスはなくなるかと
ファイル開いたら閉じる
メモリ確保したら解放する
通信接続したら切断する
って質問してまともに回答できる割合がどんなもんになるのか
始めたら終わらせる
これワンセットね
にしたほうがミスはなくなるかと
ファイル開いたら閉じる
メモリ確保したら解放する
通信接続したら切断する
228デフォルトの名無しさん
2015/12/07(月) 09:22:45.43ID:q5G1dKJA やっぱりARC最強だな
229デフォルトの名無しさん
2015/12/07(月) 15:38:30.00ID:6rSJBSiX 結局いつ開放されるか分からないってのが曲者で
使い終わったら確実にリソースを開放してほしいときは
別の仕組みが必要になってしまったってのが問題だろう
その別の仕組も、C++のデストラクタのようにクラスのメンバに関して
芋づる式に呼び出す仕組みがないから
C++のデストラクタがやっていることを手動で再現しなければならない始末
一方でC++のスマポなどの参照カウンタ方式は循環参照だけが問題だが
それ以外の問題が一切発生しない、デメリットは循環参照だけ
しかも循環参照が発生する場合は片方をweak_ptrにすれば良い
ということが分かりきっているし、循環参照が発生する箇所も
設計段階でわかる
循環参照に気を配れる知能が有るのであれば、参照カウンタ方式のほうがスマート
使い終わったら確実にリソースを開放してほしいときは
別の仕組みが必要になってしまったってのが問題だろう
その別の仕組も、C++のデストラクタのようにクラスのメンバに関して
芋づる式に呼び出す仕組みがないから
C++のデストラクタがやっていることを手動で再現しなければならない始末
一方でC++のスマポなどの参照カウンタ方式は循環参照だけが問題だが
それ以外の問題が一切発生しない、デメリットは循環参照だけ
しかも循環参照が発生する場合は片方をweak_ptrにすれば良い
ということが分かりきっているし、循環参照が発生する箇所も
設計段階でわかる
循環参照に気を配れる知能が有るのであれば、参照カウンタ方式のほうがスマート
230デフォルトの名無しさん
2015/12/07(月) 17:29:26.60ID:nEG5/lEo >>229
処理速度やタイミングがシビアな組み込みや科学技術計算系とかならいざしらず、
ソレ以外は、実際の解放のタイミング自体は問題にならんでしょ。(膨大なメモリの使用も別だけど)
問題は、使い終わったよーって明示しないで良い。という運用が結局、悪い結果をもたらしているという点。
メモリの管理をしっかり最後までやるクセのないプログラマは、
平然と参照が途切れている可能性のあるポイントで参照しに行こうとする。
結局は、そいつがバカだからに集約されてしまうんだけど、使い終わりの明示をしない文化がバカを生む土壌となっている
処理速度やタイミングがシビアな組み込みや科学技術計算系とかならいざしらず、
ソレ以外は、実際の解放のタイミング自体は問題にならんでしょ。(膨大なメモリの使用も別だけど)
問題は、使い終わったよーって明示しないで良い。という運用が結局、悪い結果をもたらしているという点。
メモリの管理をしっかり最後までやるクセのないプログラマは、
平然と参照が途切れている可能性のあるポイントで参照しに行こうとする。
結局は、そいつがバカだからに集約されてしまうんだけど、使い終わりの明示をしない文化がバカを生む土壌となっている
231デフォルトの名無しさん
2015/12/07(月) 18:21:02.44ID:q5G1dKJA そういう事になる原因ってさ、構造がぐちゃぐちゃでオブジェクト間も依存しまくって、
いつ解放していいのかわかんねえーというヘボいプログラミングなんだろうなと思う。
いつ解放していいのかわかんねえーというヘボいプログラミングなんだろうなと思う。
232デフォルトの名無しさん
2015/12/07(月) 18:23:12.12ID:tBfENkIS と馬鹿なSEやPGはそう思うだろうなとも思う。
233デフォルトの名無しさん
2015/12/07(月) 19:54:31.23ID:GogXEvJk ある意味メモリなんて一番扱いやすいリソースだからな。
メモリの管理すら適当なプログラマが、他のリソースを適切に扱える訳がないのに、GC前提の言語ではそちらのケアが言語側でやりづらくなってしまっている。
メモリの管理すら適当なプログラマが、他のリソースを適切に扱える訳がないのに、GC前提の言語ではそちらのケアが言語側でやりづらくなってしまっている。
234デフォルトの名無しさん
2015/12/07(月) 20:05:22.53ID:W4QZalq7 メモリ意識した時点で雑魚プログラマ決定だろ。
JavaScriptもPascalも使えないんじゃ話にならないよ。
おちんぽ見られることを意識しすぎて温泉に入れないようなもの。
癒やしのない人生に刺激なんてない。←これ名言
JavaScriptもPascalも使えないんじゃ話にならないよ。
おちんぽ見られることを意識しすぎて温泉に入れないようなもの。
癒やしのない人生に刺激なんてない。←これ名言
235デフォルトの名無しさん
2015/12/07(月) 20:07:43.02ID:nEG5/lEo >>231
そう。そういう状態にしちゃう原因が、いい加減なメモリの管理で教育された結果にあるのではないか?ということで。
そう。そういう状態にしちゃう原因が、いい加減なメモリの管理で教育された結果にあるのではないか?ということで。
236デフォルトの名無しさん
2015/12/07(月) 20:09:47.14ID:nEG5/lEo237デフォルトの名無しさん
2015/12/07(月) 20:16:31.05ID:ZNsl6+sP メモリ意識しないプログラマとかカスだろ。
238デフォルトの名無しさん
2015/12/07(月) 20:42:25.43ID:wP/KA6jo JavaやC#ではリソースをプログラマが管理してはいけない
せっかくメモリ管理を透過的にしたのにリソース管理でコードをより複雑化させては意味がない
真っ当な教育を受けた少数のプログラマがSafeHandleを作成する
末端のプログラマはSafeHandleのファイナライザに全てを任せてメモリと同様にリソースを完全に透過的に扱うべきだ
せっかくメモリ管理を透過的にしたのにリソース管理でコードをより複雑化させては意味がない
真っ当な教育を受けた少数のプログラマがSafeHandleを作成する
末端のプログラマはSafeHandleのファイナライザに全てを任せてメモリと同様にリソースを完全に透過的に扱うべきだ
239デフォルトの名無しさん
2015/12/07(月) 23:25:36.31ID:QznWTKRS240デフォルトの名無しさん
2015/12/08(火) 00:48:22.00ID:pyjW8EMu full GCが頻繁に生じちゃうのは明らかに設計ミスやな
immutableな短命objectを使いまくるのだ。。
つかimmutableなオブジェクト使いまくるとGCないときつくね?
immutableな短命objectを使いまくるのだ。。
つかimmutableなオブジェクト使いまくるとGCないときつくね?
241デフォルトの名無しさん
2015/12/08(火) 02:05:45.39ID:H3TgUaFB RAIIで事足りる
immutableかどうかとGCは無関係
immutableかどうかとGCは無関係
242デフォルトの名無しさん
2015/12/08(火) 02:21:53.95ID:RVFMry3L むしろ短命なオブジェクトなんてスタックで十分だし
管理するならshared_ptrのが優れてる
管理するならshared_ptrのが優れてる
243デフォルトの名無しさん
2015/12/08(火) 03:41:28.67ID:pU1qoPPC ライブラリ、アプリ、ユーザの三者で考えないと
一部リソースはユーザがを閉じることができる。
そのときアプリの参照を消す仕組みがどのライブラリにもない
一部リソースはユーザがを閉じることができる。
そのときアプリの参照を消す仕組みがどのライブラリにもない
244デフォルトの名無しさん
2015/12/08(火) 08:07:46.77ID:rWJ9nJMw245デフォルトの名無しさん
2015/12/08(火) 12:16:07.11ID:VV6tYNBF Manager.Execute((res) => ...);
これが終着点
短命なリソースは全てこの形式で事足りし長命なリソースはファイナライザにでも任せればよい
ユーザーが管理しちゃ絶対にダメ
これが終着点
短命なリソースは全てこの形式で事足りし長命なリソースはファイナライザにでも任せればよい
ユーザーが管理しちゃ絶対にダメ
246デフォルトの名無しさん
2015/12/08(火) 15:11:36.25ID:DYNM3xm/ このスレでGCいらんて言ってる人たちは環境に恵まれてるんだなぁって思う
247デフォルトの名無しさん
2015/12/08(火) 15:20:06.88ID:Bkt0caBE GC
タモリが昔宣伝してやつ?
タモリが昔宣伝してやつ?
248デフォルトの名無しさん
2015/12/08(火) 15:28:54.90ID:NMHe7TFl むしろGCなんて環境良くないと使えないだろ
249デフォルトの名無しさん
2015/12/08(火) 16:16:30.38ID:zjJIjn6V 参照がなくなったタイミングで必ず開放してくれて
かつ
循環参照でも問題ない
パーフェクトなGCが有れば最高なわけだが
実際にはそんなGCは無い
となれば、通常であれば言語側は性質の異なる複数のGCを用意しておいて
使う側はシチュエーションに合わせて選べるようにしておくのが自然な発想
しかしそういう言語は殆ど無い、これが問題
といってもマークスイープ系GCが前提のC#やJavaのような言語に
RAIIの発想を持ち込もうとしても
C++のデストラクタのように自身のメンバのデストラクタを自動で芋づる式に呼び出す仕組みが
元々無いので、手動で芋づる式に解放関数を呼び出すコードを書かなければならなく
うまく行っていない
かつ
循環参照でも問題ない
パーフェクトなGCが有れば最高なわけだが
実際にはそんなGCは無い
となれば、通常であれば言語側は性質の異なる複数のGCを用意しておいて
使う側はシチュエーションに合わせて選べるようにしておくのが自然な発想
しかしそういう言語は殆ど無い、これが問題
といってもマークスイープ系GCが前提のC#やJavaのような言語に
RAIIの発想を持ち込もうとしても
C++のデストラクタのように自身のメンバのデストラクタを自動で芋づる式に呼び出す仕組みが
元々無いので、手動で芋づる式に解放関数を呼び出すコードを書かなければならなく
うまく行っていない
250デフォルトの名無しさん
2015/12/08(火) 16:25:08.60ID:RVFMry3L251デフォルトの名無しさん
2015/12/08(火) 16:37:24.80ID:zjJIjn6V >>250
自分のクラスがファイルなんかのcloseを持つリソースをメンバに持っていたとする
そうすると、それらのメンバのリソースを明示的にcloseできるようにするために
自身もcloseを実装することになるだろう
それで、自身のcloseが呼ばれた時、勝手にメンバのcloseが呼ばれるか?
結局手動でメンバのcloseを呼び出しまわるコードを書かなければならない
C++のデストラクタならメンバのデストラクタが芋づる式に勝手に呼び出されるから
気にしなくて良い
自分のクラスがファイルなんかのcloseを持つリソースをメンバに持っていたとする
そうすると、それらのメンバのリソースを明示的にcloseできるようにするために
自身もcloseを実装することになるだろう
それで、自身のcloseが呼ばれた時、勝手にメンバのcloseが呼ばれるか?
結局手動でメンバのcloseを呼び出しまわるコードを書かなければならない
C++のデストラクタならメンバのデストラクタが芋づる式に勝手に呼び出されるから
気にしなくて良い
252デフォルトの名無しさん
2015/12/08(火) 17:08:50.17ID:NMHe7TFl 強参照、ソフト参照、弱参照、ファントム参照
この字面だけで糞言語って察せられるから凄い
この字面だけで糞言語って察せられるから凄い
253デフォルトの名無しさん
2015/12/08(火) 19:22:21.31ID:RKxPG6yJ Rustはどう?
明文化されたmoveセマンティクスと、オブジェクトの寿命と参照のチェッカを型システムに組み込んでるおかげで、
リソース管理の実行時コストをゼロにしつつ、メモリリークが発生しないプログラムが書ける。
shared_ptrに相当するRcもあるから、所有者を複数にしたい場合のコストもそれなりに抑えられる。
明文化されたmoveセマンティクスと、オブジェクトの寿命と参照のチェッカを型システムに組み込んでるおかげで、
リソース管理の実行時コストをゼロにしつつ、メモリリークが発生しないプログラムが書ける。
shared_ptrに相当するRcもあるから、所有者を複数にしたい場合のコストもそれなりに抑えられる。
254デフォルトの名無しさん
2015/12/08(火) 19:35:14.32ID:Hrv9Cion >>253
すげえ難しいらしいじゃん
すげえ難しいらしいじゃん
255デフォルトの名無しさん
2015/12/08(火) 19:52:40.51ID:NMHe7TFl rustの清貧さは好みだけどまだ触った事ないな
同期処理を省略するためかshared_ptr相当がタスク間跨げないらしいけど
そこら辺の使い勝手ってどうなんだろう
同期処理を省略するためかshared_ptr相当がタスク間跨げないらしいけど
そこら辺の使い勝手ってどうなんだろう
256デフォルトの名無しさん
2015/12/08(火) 21:00:06.21ID:RKxPG6yJ >>254 難しいのは難しいが、低レベルの世界に相応な難易度であって、理不尽さはあまり無いと思う。
自分が遭遇した理不尽というか不便は、トレイト(型クラスみたいなの)を戻り値にした、ジェネリックな関数の型注釈の煩雑さで、
そのworkaroundが、その関数の返り値専用の型を定義する、ってのがカルチャーショックだった。
https://doc.rust-lang.org/std/iter/trait.Iterator.html
↑はIteratorトレイト(Listインターフェイスみたいなもの)のドキュメントだけど、mapとかfoldとかよくある高階関数の戻り値が、それ専用の型(MapとかFold)になってる。
だから、よくある関数型言語のイメージで、何か高階関数を利用したアダプタ関数を試しに定義してみよう!ってやると、
型注釈のエラー、ライフタイムのエラー等が一辺に出てきてわけが分からなくなる。
その関数の戻り値専用の型、なんて贅沢に見えるけど、返り値のサイズを見る限り、余計なデータで膨れているわけでもなかった。
Cでstruct wrap_int { int c; };とやったときにsizeof(wrap_int)がsizeof(int)と等しいけど、それと同じことをやっていた。
型情報なんてコンパイル時に全部消えちゃうから、実行コストも無いんじゃないかと今では思う。
メモリ/リソースの所有権を意識してコードを書くこと、が身について面白いよ。
ヒープを贅沢に使ってコピーしまくりなコードを書くと汚いし遅いしなんで、ちょっとダイエットする気分も出てくる。
自分が遭遇した理不尽というか不便は、トレイト(型クラスみたいなの)を戻り値にした、ジェネリックな関数の型注釈の煩雑さで、
そのworkaroundが、その関数の返り値専用の型を定義する、ってのがカルチャーショックだった。
https://doc.rust-lang.org/std/iter/trait.Iterator.html
↑はIteratorトレイト(Listインターフェイスみたいなもの)のドキュメントだけど、mapとかfoldとかよくある高階関数の戻り値が、それ専用の型(MapとかFold)になってる。
だから、よくある関数型言語のイメージで、何か高階関数を利用したアダプタ関数を試しに定義してみよう!ってやると、
型注釈のエラー、ライフタイムのエラー等が一辺に出てきてわけが分からなくなる。
その関数の戻り値専用の型、なんて贅沢に見えるけど、返り値のサイズを見る限り、余計なデータで膨れているわけでもなかった。
Cでstruct wrap_int { int c; };とやったときにsizeof(wrap_int)がsizeof(int)と等しいけど、それと同じことをやっていた。
型情報なんてコンパイル時に全部消えちゃうから、実行コストも無いんじゃないかと今では思う。
メモリ/リソースの所有権を意識してコードを書くこと、が身について面白いよ。
ヒープを贅沢に使ってコピーしまくりなコードを書くと汚いし遅いしなんで、ちょっとダイエットする気分も出てくる。
257デフォルトの名無しさん
2015/12/08(火) 22:39:35.60ID:RVFMry3L258デフォルトの名無しさん
2015/12/08(火) 22:59:22.32ID:RKxPG6yJ >>255 shared_ptrと恒等なものは無いけど、ポインタ的に使える型がBox, Rc, Cell(あるいはRefCell)とあって、
Boxはヒープ領域であること、Rcは複数の所有者がいる(つまり所有者全員が死ぬまでは生きている)こと、Cellは複数の書き込みが作れること、
とか機能とコストが別れているから、これらを組み合わせて使う。
で、Thread Safetyを実現させる機構は上記には無いので、Atomicityを導入させるRcの類似形であるArcと、
書き込みもしたいならMutexっていう型も合わせて使う。
すると、例えば整数のベクトルをスレッド間で共有したい、とかになるとArc<Mutex<Vec<i32>>>という目が滑るような型表記をすることになる。
あんま詳しくないので、ケース毎にもっと簡単なやり方があるとは思うんだけどね。
Boxはヒープ領域であること、Rcは複数の所有者がいる(つまり所有者全員が死ぬまでは生きている)こと、Cellは複数の書き込みが作れること、
とか機能とコストが別れているから、これらを組み合わせて使う。
で、Thread Safetyを実現させる機構は上記には無いので、Atomicityを導入させるRcの類似形であるArcと、
書き込みもしたいならMutexっていう型も合わせて使う。
すると、例えば整数のベクトルをスレッド間で共有したい、とかになるとArc<Mutex<Vec<i32>>>という目が滑るような型表記をすることになる。
あんま詳しくないので、ケース毎にもっと簡単なやり方があるとは思うんだけどね。
259デフォルトの名無しさん
2015/12/08(火) 23:55:28.64ID:NMHe7TFl >>258
ああ、Arcってのが別にいるのね。納得
個人的にもう一点気になる所があるから聞いてしまう
BoxやDropを使ってるとコピー禁止になるらしいけど
これ面倒な場合ない?
最初はコピー可能な型としてガンガンコピーしてたけど
途中から終了処理を書きたくなったらコピーしてる箇所
全部直すって事?
ちなみにググってたらRWArcっての見つけたんだけど
これ読み書き可能なArcなんじゃね
ああ、Arcってのが別にいるのね。納得
個人的にもう一点気になる所があるから聞いてしまう
BoxやDropを使ってるとコピー禁止になるらしいけど
これ面倒な場合ない?
最初はコピー可能な型としてガンガンコピーしてたけど
途中から終了処理を書きたくなったらコピーしてる箇所
全部直すって事?
ちなみにググってたらRWArcっての見つけたんだけど
これ読み書き可能なArcなんじゃね
260デフォルトの名無しさん
2015/12/09(水) 00:46:02.26ID:WVnNYSfg >>249
javaは世代別管理でGCの種類は色々選べるはずでは
javaは世代別管理でGCの種類は色々選べるはずでは
261デフォルトの名無しさん
2015/12/09(水) 01:14:15.85ID:wAGGTtTq262デフォルトの名無しさん
2015/12/09(水) 01:50:08.36ID:x/ryIvcR >>259 コピーしまくっているような変数の型をTからBox<T>に変えた場合、確かに面倒なことになる。
けど、基本的に単純な代入(let x = y)はコピーじゃなくてmoveになるし、
Box<T>の値をコピーしてBox<T>の値を生成するっていうのは、同じヒープ領域を指すポインタを作るんじゃなく、
新しいヒープ領域を確保して中身をコピーし、そのポインタを返すという意味なんで、
変数の型を後でTをBox<T>に変える、という場面はあまり無い(少なくとも自分は学んでいる最中にそういうことをしたくなったことがない)
値をコピーする場面では、元の変数の型がBox<T>であってもTであっても、参照型&Tを受け取ってTを生成、ということをするのが定石。
&Tはほぼ無制限に安全に作ることができるし、安全じゃない可能性があったらコンパイルが通らない。
で、コピーした型Tの値は呼び出し元がBoxに包んでヒープ領域に置いたりするのが定石
Dropも別にコピーを禁止することは無いよ。後からつけたらエラーまみれ、ということにはならない。
あと、自作じゃない型に自作じゃないトレイト(インターフェイスみたいなもの)をつけることができないので、
例えば標準ライブラリのFileやTcpStreamはCopyできるようには決してできない。メモリ以外の資源管理も安全だよ。
けど、基本的に単純な代入(let x = y)はコピーじゃなくてmoveになるし、
Box<T>の値をコピーしてBox<T>の値を生成するっていうのは、同じヒープ領域を指すポインタを作るんじゃなく、
新しいヒープ領域を確保して中身をコピーし、そのポインタを返すという意味なんで、
変数の型を後でTをBox<T>に変える、という場面はあまり無い(少なくとも自分は学んでいる最中にそういうことをしたくなったことがない)
値をコピーする場面では、元の変数の型がBox<T>であってもTであっても、参照型&Tを受け取ってTを生成、ということをするのが定石。
&Tはほぼ無制限に安全に作ることができるし、安全じゃない可能性があったらコンパイルが通らない。
で、コピーした型Tの値は呼び出し元がBoxに包んでヒープ領域に置いたりするのが定石
Dropも別にコピーを禁止することは無いよ。後からつけたらエラーまみれ、ということにはならない。
あと、自作じゃない型に自作じゃないトレイト(インターフェイスみたいなもの)をつけることができないので、
例えば標準ライブラリのFileやTcpStreamはCopyできるようには決してできない。メモリ以外の資源管理も安全だよ。
263デフォルトの名無しさん
2015/12/12(土) 10:36:13.53ID:mXWFWn5f freeし忘れるとか、そんな超ウルトラ素人ミスを大前提に議論するのは間違いだよなw
freeしきれないとかwwww
freeしきれないとかwwww
264デフォルトの名無しさん
2015/12/12(土) 11:52:29.69ID:v/VbuB+R265デフォルトの名無しさん
2015/12/12(土) 12:05:07.06ID:yfUf7LLZ shared_ptrって参照カウント式のGCじゃないの?
266デフォルトの名無しさん
2015/12/12(土) 12:44:09.71ID:7G0ybzbE 循環を綺麗に扱えるなら参照カウントの方が良いと思うけど
VB6は循環参照の扱いどうやってるんだろう
VB6は循環参照の扱いどうやってるんだろう
267デフォルトの名無しさん
2015/12/12(土) 14:25:51.97ID:npRd3MLZ >>265
RAIIじゃろ
RAIIじゃろ
268デフォルトの名無しさん
2015/12/12(土) 15:20:38.55ID:tVgJgcBS269名無しさん@そうだ選挙に行こう
2015/12/14(月) 08:16:09.53ID:hn3965Zz2015/12/14(月) 08:38:44.84ID:sXTPVO5Q
片付ける奴が馬鹿なのだ。素人ほど簡単だと言いたがり、上級者ほど簡単ではないとはっきり言うものだ。
どの分野でもな。
どの分野でもな。
2015/12/14(月) 09:09:02.89ID:lNUL9lX8
freeとか言ってる奴はC++使えよ。いつまでC使ってんだ。
2015/12/14(月) 09:20:53.11ID:MauTQhQ/
2015/12/14(月) 09:35:23.70ID:sXTPVO5Q
2015/12/14(月) 09:37:05.77ID:eBJzgHzn
それ中級者
あと、東大生は教えるの上手いのもいるから想像で話すな馬鹿
あと、東大生は教えるの上手いのもいるから想像で話すな馬鹿
2015/12/14(月) 09:41:37.74ID:sXTPVO5Q
このようにおまえのようなコンテキストすらまともに読めないPGは五万といる。
スレッドがデッドロックしてメモリを開放できないなんてよくあることだ。
スレッドがデッドロックしてメモリを開放できないなんてよくあることだ。
276名無しさん@そうだ選挙に行こう
2015/12/14(月) 10:59:16.82ID:hn3965Zz >>275
。。。。。完全な設計ミスじゃん
。。。。。完全な設計ミスじゃん
2015/12/14(月) 11:15:19.23ID:eBJzgHzn
2015/12/14(月) 11:40:27.14ID:ETDpPCfc
スレッドがデッドロックしたらメモリリークどころじゃないじゃないかwww
2015/12/14(月) 14:48:51.74ID:MOnxQz3f
スレッドがデッドロックしちゃってメモリ解放できない(泣)
っていうPGが五万といるのかよw
っていうPGが五万といるのかよw
280名無しさん@そうだ選挙に行こう
2015/12/14(月) 15:51:19.55ID:hn3965Zz まぁfreeやdeleteやnullやらすらできないPGに、「僕はそんなこと管理しきれる脳みそ持ってない!」って言われたらソレは真実なんだろうけど・・・。
そんな脳みそPGに「もっと複雑な業務使用」を理解できるとは思えないんだ。
そんなPGにプログラミングの場を与えるのが間違い。
そんな脳みそPGに「もっと複雑な業務使用」を理解できるとは思えないんだ。
そんなPGにプログラミングの場を与えるのが間違い。
2015/12/14(月) 15:58:21.86ID:2JSVZtRY
そもそも実務でスレッド使うPGなんてゴマンもいない
2015/12/14(月) 17:06:58.52ID:eBJzgHzn
Javaのプロジェクトだとほぼ使ってるけどな隠蔽してるだけで
そのせいで共有リソース壊したり、逆に個人情報の領域が共有されたりして、とんでもないインシデントが発生する
そんな奴等にメモリ管理なんて任せられんし、共有リソースも触らせたくないから
更に隠蔽したフレームワークもどきが出来上がる
そのせいで共有リソース壊したり、逆に個人情報の領域が共有されたりして、とんでもないインシデントが発生する
そんな奴等にメモリ管理なんて任せられんし、共有リソースも触らせたくないから
更に隠蔽したフレームワークもどきが出来上がる
283名無しさん@そうだ選挙に行こう
2015/12/14(月) 17:59:33.07ID:hn3965Zz■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 日経平均の下落率3%超す、財政懸念で長期金利上昇 ★2 [お断り★]
- 【実況】博衣こよりのえちえち歌枠🧪
- 【高市朗報】 日本政府「一昨年は1300億円。去年も防衛費が1100億円余ったw」 日本の防衛費は充分足りてる事が判明。増やす必要無し [485983549]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 高市早苗「支持者の理解を得られないので台湾発言を撤回できない」 [931948549]
- 外務省局長、よくわからないまま帰国へ [834922174]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
