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
438デフォルトの名無しさん
2016/03/27(日) 20:35:08.73ID:Ng/EIIMI RAII信者の痛さは異常
オブジェクトをコピーされたら破綻するのに
オブジェクトをコピーされたら破綻するのに
439デフォルトの名無しさん
2016/03/27(日) 21:10:56.38ID:N7IGtcj3 グローバルインスタンスホルダーは明確にインスタンスの状態を把握したいときに積極的に使うべき
440デフォルトの名無しさん
2016/03/27(日) 22:32:53.86ID:vj+h39OC >「いつか」全員が所有権を手放したら「即座に」破棄される
>「いつか」全員が所有権を手放したら「いつか」GCで破棄される
>どう違うというのか。
少なくとも最善が尽くされるという意味で違うし
同じデータと同じプログラムで有れば、常に同じタイミングで開放処理が走るという再現性が有る
それから、自分しか所有権を持っていない場合、つまり参照数が常に1というシンプルな状況ですら
参照カウンタ方式の方が開放処理が自動化されて楽
参照カウンタ方式で有れば、スマポを使っておけば済む
scoped_ptrでも良い
マークスイープ系GCであれば、自身しか所有権を持たない単純な場合でも
非常に面倒なことになる
自身にDisposeを実装して自身のメンバのDisposeを呼び出すコードを手動で書かなければならない
何故こういったコードをコンパイラが自動生成できず、手動で書かなければならないのかの根底に
まさにマークスイープGCの存在が有る
マークスイープ系GCは何処からも参照されなくなったことがその場ですぐに分からない
GCを発動してみるまで保証することが出来ない
自分のDisposeが呼び出された、まさにその瞬間に、自分のメンバに対してもDisposeしてよいのかどうなのか
参照数がリアルタイムで即座に分からないので判断する材料が何も無く
コンパイラはC++のデストラクタのように自動で芋づる式に開放処理を呼び出すコードを生成することが出来ない
要するにマークスイープ系GCではDisposeのコンパイラによる自動生成が出来ないという大きなマイナスが有る
>「いつか」全員が所有権を手放したら「いつか」GCで破棄される
>どう違うというのか。
少なくとも最善が尽くされるという意味で違うし
同じデータと同じプログラムで有れば、常に同じタイミングで開放処理が走るという再現性が有る
それから、自分しか所有権を持っていない場合、つまり参照数が常に1というシンプルな状況ですら
参照カウンタ方式の方が開放処理が自動化されて楽
参照カウンタ方式で有れば、スマポを使っておけば済む
scoped_ptrでも良い
マークスイープ系GCであれば、自身しか所有権を持たない単純な場合でも
非常に面倒なことになる
自身にDisposeを実装して自身のメンバのDisposeを呼び出すコードを手動で書かなければならない
何故こういったコードをコンパイラが自動生成できず、手動で書かなければならないのかの根底に
まさにマークスイープGCの存在が有る
マークスイープ系GCは何処からも参照されなくなったことがその場ですぐに分からない
GCを発動してみるまで保証することが出来ない
自分のDisposeが呼び出された、まさにその瞬間に、自分のメンバに対してもDisposeしてよいのかどうなのか
参照数がリアルタイムで即座に分からないので判断する材料が何も無く
コンパイラはC++のデストラクタのように自動で芋づる式に開放処理を呼び出すコードを生成することが出来ない
要するにマークスイープ系GCではDisposeのコンパイラによる自動生成が出来ないという大きなマイナスが有る
441デフォルトの名無しさん
2016/03/27(日) 22:36:05.37ID:15KjVKPo >>438
しねーよ
しねーよ
442デフォルトの名無しさん
2016/03/27(日) 22:41:25.16ID:VNvh7E4d >>440
子要素をDisposeしていいかどうかもわからないってそりゃ設計サボってる以外のなんでもないだろう
ちゃんと設計してればいつ削除してよいかなんてわかるはずだろ
まともに設計もできないレガシーエンジニアは黙っててよ
設計に時間使わないとリソース云々以前に別のバグだらけになるぞ
子要素をDisposeしていいかどうかもわからないってそりゃ設計サボってる以外のなんでもないだろう
ちゃんと設計してればいつ削除してよいかなんてわかるはずだろ
まともに設計もできないレガシーエンジニアは黙っててよ
設計に時間使わないとリソース云々以前に別のバグだらけになるぞ
443デフォルトの名無しさん
2016/03/27(日) 23:42:37.04ID:Ng/EIIMI RAII信者は頭が悪いな
444デフォルトの名無しさん
2016/03/27(日) 23:59:39.99ID:15KjVKPo >>443
自分の頭を検証しな
自分の頭を検証しな
445デフォルトの名無しさん
2016/03/28(月) 00:10:58.97ID:h9yZCrPP メンバにDispose持たせる設計って大抵ダメだよね
446デフォルトの名無しさん
2016/03/28(月) 00:20:40.85ID:j/beyn8U >>440
前者(参照カウントGC)はRAIIができるが後者(マーク&スイープGC)ではできないというお前の
主張について言っているんだが?
「最善が尽くされる」からRAIIができて、尽くされないからRAIIができないとでも言うのだろうかw
>要するにマークスイープ系GCではDisposeのコンパイラによる自動生成が出来ないという大きなマイナスが有る
何度も例に挙げているC++/CLIでは、デストラクタを記述するとコンパイラによってDisposeが追加される。
そして、ローカルスコープに置いたオブジェクトに対してはスコープを抜ける際に自動的にdeleteが呼ばれる。
そこからdelete→Dispose→デストラクタと呼び出される。RAIIに必要なものは揃っているし、事実、可能だ。
もちろん、そのメモリ領域は別のタイミングでGCによって回収される。
ここまで説明しても理解できない低脳ならしょうがない。
やはりデストラクタとファイナライザの違いが理解できてないようだからそこから勉強しなおせ。
前者(参照カウントGC)はRAIIができるが後者(マーク&スイープGC)ではできないというお前の
主張について言っているんだが?
「最善が尽くされる」からRAIIができて、尽くされないからRAIIができないとでも言うのだろうかw
>要するにマークスイープ系GCではDisposeのコンパイラによる自動生成が出来ないという大きなマイナスが有る
何度も例に挙げているC++/CLIでは、デストラクタを記述するとコンパイラによってDisposeが追加される。
そして、ローカルスコープに置いたオブジェクトに対してはスコープを抜ける際に自動的にdeleteが呼ばれる。
そこからdelete→Dispose→デストラクタと呼び出される。RAIIに必要なものは揃っているし、事実、可能だ。
もちろん、そのメモリ領域は別のタイミングでGCによって回収される。
ここまで説明しても理解できない低脳ならしょうがない。
やはりデストラクタとファイナライザの違いが理解できてないようだからそこから勉強しなおせ。
447デフォルトの名無しさん
2016/03/28(月) 00:39:52.48ID:2h3yopdG {
std::shared_ptr<my_namespace::my_class> p(new my_namespace::my_class(...));
/* unko_code */
}
using(var obj = new MyClass(...)) {
/* GoodCode */
}
美しいという事はいい事だね
C#は書いてある事がシンタックス的にもセマンティック的にも明確だ
リソース管理はこうでなければならない
std::shared_ptr<my_namespace::my_class> p(new my_namespace::my_class(...));
/* unko_code */
}
using(var obj = new MyClass(...)) {
/* GoodCode */
}
美しいという事はいい事だね
C#は書いてある事がシンタックス的にもセマンティック的にも明確だ
リソース管理はこうでなければならない
448デフォルトの名無しさん
2016/03/28(月) 01:22:52.25ID:khgTmo3F >>447
C++にもusing使えやw いらない波括弧外せやw
C++にもusing使えやw いらない波括弧外せやw
449デフォルトの名無しさん
2016/03/28(月) 03:34:15.37ID:d3YBhLBG450デフォルトの名無しさん
2016/03/28(月) 03:36:11.96ID:d3YBhLBG schemeに何十年も前から存在するwith-xxxx 系を一般化した構文だね
451デフォルトの名無しさん
2016/03/29(火) 01:23:53.57ID:Qm5oX8hY アレを更にtypedefされたりされると
ワケワカランくなるよな
ワケワカランくなるよな
452デフォルトの名無しさん
2016/03/29(火) 01:50:13.51ID:40IzaG0J c++なら普通こうだな
{
my_class obj(...);
...
}
そういやc#でp.release()相当の事って簡単にできるの?
{
auto p(make_unique<my_class>(...));
...
}
nullって代入可能?
{
my_class obj(...);
...
}
そういやc#でp.release()相当の事って簡単にできるの?
{
auto p(make_unique<my_class>(...));
...
}
nullって代入可能?
453デフォルトの名無しさん
2016/04/04(月) 02:47:24.69ID:+1V6ohqL GCがあるのになぜJavaはメモリリークしまくるソフトウェアを量産するのか
454デフォルトの名無しさん
2016/04/04(月) 02:55:18.29ID:FhdBY7IF >>453
Javaだから
Javaだから
455デフォルトの名無しさん
2016/04/12(火) 23:15:42.48ID:ZWvwh7J9 Rust使えばいいのさ
456デフォルトの名無しさん
2016/04/13(水) 10:33:47.16ID:+hJ3fPVS >>455
会社にいるよな、そういうやつ
会社にいるよな、そういうやつ
457デフォルトの名無しさん
2016/04/13(水) 15:29:31.16ID:oOcEPJTu GC大好きっ子に聞きたいんだが
完璧な(理想的な)GCを搭載したメジャーな言語処理系って何があるの?
これで開発すればリークも管理も気にしないでOKってやつ
完璧な(理想的な)GCを搭載したメジャーな言語処理系って何があるの?
これで開発すればリークも管理も気にしないでOKってやつ
458デフォルトの名無しさん
2016/04/13(水) 16:22:35.14ID:s5MRiDQ8 無い
マークスイープ系GC → 循環参照OK、しかし即座に開放されない
参照カウンタGC → 即座に開放される、しかし循環参照NG
ということで、理想のGCは無い
全てのGCは何かを妥協している
それから、たとえGCを使ったとしても
要らなくなったオブジェクトの参照をいつまでも握っている奴が居たら解放されないから
リソースの管理をしなくてよいということは無い
あと、GCは基本的にメインメモリに対してしか有効に機能しないから
例えばファイルオブジェクトなんかは要らなくなったら即座にcloseするなりすべきで
リソース管理フリーというわけにはいかない
マークスイープ系GC → 循環参照OK、しかし即座に開放されない
参照カウンタGC → 即座に開放される、しかし循環参照NG
ということで、理想のGCは無い
全てのGCは何かを妥協している
それから、たとえGCを使ったとしても
要らなくなったオブジェクトの参照をいつまでも握っている奴が居たら解放されないから
リソースの管理をしなくてよいということは無い
あと、GCは基本的にメインメモリに対してしか有効に機能しないから
例えばファイルオブジェクトなんかは要らなくなったら即座にcloseするなりすべきで
リソース管理フリーというわけにはいかない
459デフォルトの名無しさん
2016/04/13(水) 16:54:16.68ID:s5MRiDQ8 つまりは、GCを使っていたとしても
君がオブジェクトを何処かに登録したなら
オブジェクトが要らなくなったら登録解除してあげないと
そのオブジェクトは解放されないのだ
これはちょうどmallocしたらfreeしましょうに似ていて
GCを使ったとしても全てのリソースの管理が自動になるわけではないということだね
究極的にはGCの利点は自分でfree/deleteをしなくても良いところにある
これはつまり、ダングリングポインタが発生しないということだ
君がオブジェクトを何処かに登録したなら
オブジェクトが要らなくなったら登録解除してあげないと
そのオブジェクトは解放されないのだ
これはちょうどmallocしたらfreeしましょうに似ていて
GCを使ったとしても全てのリソースの管理が自動になるわけではないということだね
究極的にはGCの利点は自分でfree/deleteをしなくても良いところにある
これはつまり、ダングリングポインタが発生しないということだ
460デフォルトの名無しさん
2016/04/14(木) 20:54:37.84ID:f1hhftJp >>457
C+BoehmGC
C+BoehmGC
461デフォルトの名無しさん
2016/04/17(日) 16:17:55.58ID:j/f/oFPY そして無視されてしまうコピーGC君
GCの利点は自分で大量にメモリの確保&解放するプログラムにおいてバグが出にくくスループットも出るってところだと思う
もしheapをそんなに頻繁に確保&解放しないんだったらGCない言語の方がいい
ただ近代的な言語は少数の例外を除いて大抵GC積んでるけど
GCの利点は自分で大量にメモリの確保&解放するプログラムにおいてバグが出にくくスループットも出るってところだと思う
もしheapをそんなに頻繁に確保&解放しないんだったらGCない言語の方がいい
ただ近代的な言語は少数の例外を除いて大抵GC積んでるけど
462デフォルトの名無しさん
2016/04/17(日) 16:21:44.96ID:j/f/oFPY >リソース管理フリーというわけにはいかない
リソース管理フリーについてはrustみたいなGCない言語のほうが達成できてるよね(あとは関数型言語か)
でもrustでもリソースの解放時にエラーを吐く可能性がある処理なら自分で解放する処理書かなきゃいけないっぽいけど
リソース管理フリーについてはrustみたいなGCない言語のほうが達成できてるよね(あとは関数型言語か)
でもrustでもリソースの解放時にエラーを吐く可能性がある処理なら自分で解放する処理書かなきゃいけないっぽいけど
463デフォルトの名無しさん
2016/04/17(日) 18:35:17.89ID:SAR9JCaP RAIIでも結局どのタイミングで解放されるか意識しなくてもいいってわけじゃないし
リソース解放処理を書かなくていいだけで
リソース解放処理を書かなくていいだけで
464デフォルトの名無しさん
2016/04/17(日) 18:43:59.82ID:cFoKw8Zx メモリ管理系のバグが顕在化しにくいだけで、そこら辺適当なまま中途半端にキャリアを積む開発者を量産するという害悪が大きい。
JNIやらで他のAPI使う必要が出てくると結局いろいろ配慮しなきゃいけなくなるし。
JNIやらで他のAPI使う必要が出てくると結局いろいろ配慮しなきゃいけなくなるし。
465デフォルトの名無しさん
2016/04/17(日) 19:43:44.44ID:oNE1M7I6 >>460
コンサバじゃ完璧にほど遠いぞな
コンサバじゃ完璧にほど遠いぞな
466デフォルトの名無しさん
2016/04/17(日) 19:50:47.36ID:1R/4ebGS >メモリ管理系のバグが顕在化しにくいだけ
結局これだよね
本当に丸投げできるなら乗っかるのもいいと思う
性能問題はハードの進化で一部の用途を除けば問題無くなると思うし
でも現実は中途半端だから意識して書いたほうがマシだと
結局これだよね
本当に丸投げできるなら乗っかるのもいいと思う
性能問題はハードの進化で一部の用途を除けば問題無くなると思うし
でも現実は中途半端だから意識して書いたほうがマシだと
467デフォルトの名無しさん
2016/04/17(日) 21:19:09.59ID:IB74e9ph ムーブセマンティクスのおかげでずいぶん便利に。
468デフォルトの名無しさん
2016/04/17(日) 23:09:38.99ID:j/f/oFPY あと正確にはGCには含まれないけどメモリコンパクションをやってくれる処理系が多いのも
GCを使う利点になるかも
GCを使う利点になるかも
469デフォルトの名無しさん
2016/04/17(日) 23:17:23.70ID:cFoKw8Zx 今どき意図的にやらない限りメモリフラグメンテーションで困るような場面があるか?
アドレス空間も余裕出てきたし、多少おかしな確保パターンで浪費してもGCほど実メモリを食わないし。
今どき主流のサイズ毎に空きを管理するmallocは優秀だしね。
これがダメならlinuxカーネルとか先に落ちちゃうぞ。
アドレス空間も余裕出てきたし、多少おかしな確保パターンで浪費してもGCほど実メモリを食わないし。
今どき主流のサイズ毎に空きを管理するmallocは優秀だしね。
これがダメならlinuxカーネルとか先に落ちちゃうぞ。
470デフォルトの名無しさん
2016/04/18(月) 15:56:44.18ID:kcE0qDSU471デフォルトの名無しさん
2016/04/18(月) 16:30:17.23ID:BDPQ12Es 自前のメモリ管理が超下手くそなだけやろ
修業して出直してこいや
修業して出直してこいや
472デフォルトの名無しさん
2016/04/18(月) 16:37:09.21ID:OvHIqTOi 自慢になってないような
473デフォルトの名無しさん
2016/04/18(月) 16:44:52.62ID:9yQABY6F ゲームだとフラグメント問題になること多いよ
ゲーム専用機なら特に
最近は特にオープンワールドが当たり前になってるけど
あれストリーミングでどんどんメモリ置き換えていくしね
ゲーム専用機なら特に
最近は特にオープンワールドが当たり前になってるけど
あれストリーミングでどんどんメモリ置き換えていくしね
474デフォルトの名無しさん
2016/04/18(月) 16:47:31.98ID:/wa5LIjH jemallocのようなモダンなmalloc実装使えば良かったのでは。
475デフォルトの名無しさん
2016/04/18(月) 17:47:00.91ID:IBBVu28x ゲーム専用機でフラグメンテーションおこすとか開発者としての適性を疑われても不思議ではない。
オブジェクトの寿命管理すらしないのか?
オブジェクトの寿命管理すらしないのか?
476デフォルトの名無しさん
2016/04/18(月) 18:51:08.61ID:RPQ9NKJO メモリのフラグメンテーションをC/C++でコントロールする方法ってあるの?
mallocの実装頼りじゃなく。
mallocの実装頼りじゃなく。
477デフォルトの名無しさん
2016/04/18(月) 19:05:27.63ID:OvHIqTOi mallocの挙動がわかってれば、ある程度は・・・・
478デフォルトの名無しさん
2016/04/18(月) 19:14:30.71ID:OvHIqTOi 細かくメモリ要求するから、下回りで時間がかかる
メモリ分断されてもオンメモリでの検索はさほど時間がかからない
(空きができても、そこに入らないときに)
メモリ分断されてもオンメモリでの検索はさほど時間がかからない
(空きができても、そこに入らないときに)
479デフォルトの名無しさん
2016/04/18(月) 19:15:14.97ID:9yQABY6F480デフォルトの名無しさん
2016/04/18(月) 19:21:39.69ID:IBBVu28x 寿命管理で解決できないとか、フラグメンテーションがどういう現象か分かっているの?
汎用の寿命管理APIみたいなのを使うとか言うのと勘違いでもしている?
汎用の寿命管理APIみたいなのを使うとか言うのと勘違いでもしている?
481デフォルトの名無しさん
2016/04/18(月) 20:02:22.75ID:3yZKjOEp >>480
おいおい・・
この場合寿命を管理できないってのはgiven conditionとして考えないと
そりゃ寿命があらかじめわかってるなら苦労しないっての
大規模なプログラムでそんな恵まれた状況は例外的だよ
おいおい・・
この場合寿命を管理できないってのはgiven conditionとして考えないと
そりゃ寿命があらかじめわかってるなら苦労しないっての
大規模なプログラムでそんな恵まれた状況は例外的だよ
482デフォルトの名無しさん
2016/04/18(月) 20:57:42.92ID:IBBVu28x 専用ゲーム機上のゲームだよ。
リソースが逼迫したら何を優先するかの戦略も含めてほぼ理想的なgiven conditionだろうに。
ユーザーの行動による不確定性も全てコントロール下にあるだろうに。
リソースが逼迫したら何を優先するかの戦略も含めてほぼ理想的なgiven conditionだろうに。
ユーザーの行動による不確定性も全てコントロール下にあるだろうに。
483デフォルトの名無しさん
2016/04/18(月) 21:13:59.16ID:RPQ9NKJO >>482 専用ゲーム機と普通のPCの1アプリケーションとで何が違うのか。mallocも使わないってこと?
NoGC, 各GCでメモリ空間がどう使われるかを視覚化
ttps://spin.atomicobject.com/2014/09/03/visualizing-garbage-collection-algorithms/
黒: 未使用
灰: 確保
緑: 読み込み
黄: 書き込み
赤: GC用のアクセス(参照カウンタ、マーク用ビットetc)
緑と黄は時間経過で退色していく
メモリフラグメンテーションという観点から見ると、コピー型GCが綺麗。
NoGC, 各GCでメモリ空間がどう使われるかを視覚化
ttps://spin.atomicobject.com/2014/09/03/visualizing-garbage-collection-algorithms/
黒: 未使用
灰: 確保
緑: 読み込み
黄: 書き込み
赤: GC用のアクセス(参照カウンタ、マーク用ビットetc)
緑と黄は時間経過で退色していく
メモリフラグメンテーションという観点から見ると、コピー型GCが綺麗。
484デフォルトの名無しさん
2016/04/18(月) 21:15:59.31ID:3yZKjOEp まぁテトリスとかならその程度の理解でいいんじゃない?w
485デフォルトの名無しさん
2016/04/18(月) 21:33:24.92ID:kcE0qDSU Javaの寿命管理APIは最強ですな。
486デフォルトの名無しさん
2016/04/18(月) 21:49:39.41ID:9yQABY6F487デフォルトの名無しさん
2016/04/18(月) 21:56:15.95ID:IBBVu28x 普通のmallocで足りるならそれでもいいけど。
基本メモリ容量ギリギリまで使うから、最初に描画、ゲーム内部状態、音声、ディスクキャッシュなどでどのくらい使うか決めておく。
終始一貫して静的に決めるのが楽だけど、場合によっては場面ごとに配分を切り替えたりする。
で、例えば広いマップ上を自由に動き回るようなゲームだと、マップを複数のパーツに分割して、詳細モデルから簡易モデルまで用意する。
基本メモリ容量ギリギリまで使うから、最初に描画、ゲーム内部状態、音声、ディスクキャッシュなどでどのくらい使うか決めておく。
終始一貫して静的に決めるのが楽だけど、場合によっては場面ごとに配分を切り替えたりする。
で、例えば広いマップ上を自由に動き回るようなゲームだと、マップを複数のパーツに分割して、詳細モデルから簡易モデルまで用意する。
488デフォルトの名無しさん
2016/04/18(月) 22:12:01.61ID:3yZKjOEp ゲームプログラムとかならメモリ確保は直接システムコール呼び出して
ページ単位でアロケートするのが定石
必要ならmspaceとかインスタンスベースのヒープを自分で作る
ページ単位でアロケートするのが定石
必要ならmspaceとかインスタンスベースのヒープを自分で作る
489デフォルトの名無しさん
2016/04/19(火) 01:49:46.30ID:KVIhh3Hm 使用できるメモリのサイズも空きメモリのサイズも最初から分かってて、ユーザーからの入力も限られてて、
そいつら全部自分で管理できる「恵まれた」環境でしか通用しないアプローチだよなそれ。
そいつら全部自分で管理できる「恵まれた」環境でしか通用しないアプローチだよなそれ。
490デフォルトの名無しさん
2016/04/19(火) 01:58:46.65ID:fq3yh1do レーシングゲームは出てくる車が決まっていてコースも決まっているから。
491デフォルトの名無しさん
2016/04/19(火) 08:28:57.71ID:YcewE61x 昨今はレースゲームでも汎用的なゲームエンジン使うことが多いから
その場合事前に寿命が決まってる前提の作りにはしていないと思うぞ
GDCとかGame Gemとかでも昔からフラグメンテーション対策を含む
メモリ管理の手法はいろいろ議論されているから調べてみるとよろし
その場合事前に寿命が決まってる前提の作りにはしていないと思うぞ
GDCとかGame Gemとかでも昔からフラグメンテーション対策を含む
メモリ管理の手法はいろいろ議論されているから調べてみるとよろし
492デフォルトの名無しさん
2016/04/20(水) 12:56:58.01ID:r07pzD8i493デフォルトの名無しさん
2016/04/20(水) 13:09:41.53ID:DLw9rf+F494デフォルトの名無しさん
2016/04/20(水) 19:22:46.02ID:bj66dBvK >>493
フラグメンテーションの話だっての
フラグメンテーションの話だっての
495デフォルトの名無しさん
2016/04/20(水) 19:58:58.01ID:CuR1I1mj やり手のゲーム系の方たちに、逆らうようなことは・・・・
496デフォルトの名無しさん
2016/04/21(木) 01:20:25.83ID:jf1w54Av497デフォルトの名無しさん
2016/04/21(木) 02:16:29.96ID:G+xv7xqn >>496
どうとでもなるって?
へーじゃあ試させてもらうわ
GDC 2016でもこういう講演があった
http://schedule.gdconf.com/session/building-a-low-fragmentation-memory-system-for-64-bit-games
64bitならなぜフラグメンテーションが軽減できるか説明してもらおうか?
物理メモリが多いからじゃないからな
あればあるだけメモリ使うのがゲームなのでメモリに余裕があるわけじゃない
どうとでもなるって?
へーじゃあ試させてもらうわ
GDC 2016でもこういう講演があった
http://schedule.gdconf.com/session/building-a-low-fragmentation-memory-system-for-64-bit-games
64bitならなぜフラグメンテーションが軽減できるか説明してもらおうか?
物理メモリが多いからじゃないからな
あればあるだけメモリ使うのがゲームなのでメモリに余裕があるわけじゃない
498デフォルトの名無しさん
2016/04/21(木) 11:32:02.27ID:EjzxVVPK ゲーム機含む組み込み系は結果が不確定な動的メモリー確保なんかしないのが鉄板(しようとする奴は未熟な馬鹿)だったが
PCと合わせて組み込み機器もスペックが潤沢になって富豪的プログラムが一般的になってきたからね
無知ゆえ聞きたいんだが
最近のゲームソフトやら>>497やらってどういうGC使ってるの?
PCと合わせて組み込み機器もスペックが潤沢になって富豪的プログラムが一般的になってきたからね
無知ゆえ聞きたいんだが
最近のゲームソフトやら>>497やらってどういうGC使ってるの?
499デフォルトの名無しさん
2016/04/21(木) 13:09:31.92ID:pog3nPgL ゲームだって組込みだって今どき動的メモリー確保しないなんて化石みたいな発想が通るわけないだろ
かといって普通のGCは問題外
賢いメモリアロケーションをするしかないんだよ
>>497は「こんなすごい講演するぞ」って言う宣伝だけだけど中身はどこにあるの?
かといって普通のGCは問題外
賢いメモリアロケーションをするしかないんだよ
>>497は「こんなすごい講演するぞ」って言う宣伝だけだけど中身はどこにあるの?
500デフォルトの名無しさん
2016/04/21(木) 16:14:15.43ID:lEi5GQja >>497
MMUが付いているから
物理メモリがフラグメンテーションすることは、ある程度これで防げる
しかもハードウェアの機能だから高速だし、勝手にやってくれるから素晴らしい
速度が重要なゲームでは、これは有り難い
ソフト的なアプローチでこれ以上の細工は遅くなるだけで効果が薄い
問題は論理アドレスの方
32bit空間だと例え物理メモリが余っていても
論理アドレスがフラグメンテーションを起こして連続したメモリを確保できなくなる
物理アドレスが枯渇するよりもさきに、そちらの方が問題になることが多い
64bitだと、これが防げる
MMUが付いているから
物理メモリがフラグメンテーションすることは、ある程度これで防げる
しかもハードウェアの機能だから高速だし、勝手にやってくれるから素晴らしい
速度が重要なゲームでは、これは有り難い
ソフト的なアプローチでこれ以上の細工は遅くなるだけで効果が薄い
問題は論理アドレスの方
32bit空間だと例え物理メモリが余っていても
論理アドレスがフラグメンテーションを起こして連続したメモリを確保できなくなる
物理アドレスが枯渇するよりもさきに、そちらの方が問題になることが多い
64bitだと、これが防げる
501デフォルトの名無しさん
2016/04/21(木) 16:37:13.61ID:lEi5GQja 各ゲーム機の事情は知らないが
PCで有れば、64bitプロセスは、論理アドレスの空間が256TB(48bit)もある
ゲーム機も似たようなものだろう
256TBもの物理メモリを積んだPCやゲーム機は存在していないし
例え論理アドレスが激しくラグメンテーションを起こしても
256TBもの論理アドレス空間を使い切るという事態は考えなくてよい
つまり、64bitプロセスなら、論理アドレスの心配はしなくてよい
一方で、物理アドレスのフラグメンテーションはMMUに任せておけばよい
これはハードウェアで自動で行われるし、とても高速
その余計にソフトウェア的アプローチで頑張ってみたところで
多少物理メモリのフラグメンテーションは改善されるかもしれないが
徒労というかなんというか、労力に見合わないし
しかも遅くなるのでゲームには向いていないし、やらなくてよい
物理アドレスは自分だけが使っているわけではなく、OSを含めたほかのプロセスも使っているので
自分のプロセスが使っている物理メモリだけフラグメンテーションを解消しようと
コンパクションするのも何か完璧感が無いし
自分のプロセス内だけで考えても、外部ライブラリやXBoxならDirectXが使用している物理メモリの
フラグメンテーションは手が出せないので解消しようがない、やはりやるだけ徒労
自分の管理出来る部分だけ物理メモリのコンパクションをかけても
「これで計算上、必ずあと200MBの物理メモリを使用できる筈」とかといった保証はどこにもない
理由は、外部のライブラリ内での物理メモリの使用状況が分からないし、手が出せないから
とにかく徒労であり、MMUに任せておけばよい
PCで有れば、64bitプロセスは、論理アドレスの空間が256TB(48bit)もある
ゲーム機も似たようなものだろう
256TBもの物理メモリを積んだPCやゲーム機は存在していないし
例え論理アドレスが激しくラグメンテーションを起こしても
256TBもの論理アドレス空間を使い切るという事態は考えなくてよい
つまり、64bitプロセスなら、論理アドレスの心配はしなくてよい
一方で、物理アドレスのフラグメンテーションはMMUに任せておけばよい
これはハードウェアで自動で行われるし、とても高速
その余計にソフトウェア的アプローチで頑張ってみたところで
多少物理メモリのフラグメンテーションは改善されるかもしれないが
徒労というかなんというか、労力に見合わないし
しかも遅くなるのでゲームには向いていないし、やらなくてよい
物理アドレスは自分だけが使っているわけではなく、OSを含めたほかのプロセスも使っているので
自分のプロセスが使っている物理メモリだけフラグメンテーションを解消しようと
コンパクションするのも何か完璧感が無いし
自分のプロセス内だけで考えても、外部ライブラリやXBoxならDirectXが使用している物理メモリの
フラグメンテーションは手が出せないので解消しようがない、やはりやるだけ徒労
自分の管理出来る部分だけ物理メモリのコンパクションをかけても
「これで計算上、必ずあと200MBの物理メモリを使用できる筈」とかといった保証はどこにもない
理由は、外部のライブラリ内での物理メモリの使用状況が分からないし、手が出せないから
とにかく徒労であり、MMUに任せておけばよい
502デフォルトの名無しさん
2016/04/21(木) 17:22:28.74ID:7dcTEyv0 ただの物理メモリ不足の話がなんでと思ってしまった
swapはじまったら、fpsなゲームはどうなるんでしょうね
swapはじまったら、fpsなゲームはどうなるんでしょうね
503デフォルトの名無しさん
2016/04/21(木) 19:18:25.46ID:zEEe/DNn 論理アドレスが64bitだったらフラグメンテーション対策なんていらんということ?いや自分もそうは思うんだが。
上の方で「専用ゲーム機開発ならフラグメンテーション対策も行うのが常識!」みたいに主張してる人がいて、
それって自作のmalloc相当のアロケータ作るってことだよね?と思ったんだが、
メモリ節約術とごっちゃにしてる人もいてわけが分からなくなってきた。
上の方で「専用ゲーム機開発ならフラグメンテーション対策も行うのが常識!」みたいに主張してる人がいて、
それって自作のmalloc相当のアロケータ作るってことだよね?と思ったんだが、
メモリ節約術とごっちゃにしてる人もいてわけが分からなくなってきた。
504デフォルトの名無しさん
2016/04/21(木) 22:14:27.41ID:WHT47icf なんで馬鹿に限って長文書きたがるんだろうか
505デフォルトの名無しさん
2016/04/22(金) 08:58:47.78ID:imh5rD9T506デフォルトの名無しさん
2016/04/22(金) 11:30:03.69ID:+Z1ZyILi わかってなさそうな方がそれっぽいこと・・・・
507デフォルトの名無しさん
2016/04/22(金) 12:23:02.13ID:UzNl+aCx わかってる方は完結に書いてみればいい
508デフォルトの名無しさん
2016/04/22(金) 15:49:44.48ID:+Z1ZyILi 学校の先生にそう教わったんですね
509デフォルトの名無しさん
2016/04/22(金) 19:23:46.16ID:cAq2nbH2 用途ごとにセグメント分けて使い回すのが無難じゃないの
オブジェクトの数が足りなくなったら透明でいいのよ
オブジェクトの数が足りなくなったら透明でいいのよ
510デフォルトの名無しさん
2016/04/22(金) 20:32:21.23ID:1FeuO5Gj 結局のところ、物理アドレスのフラグメンテーションはMMUが勝手になんとかしてくれるからあまり問題にならない
しかし論理アドレスの方は何にもしてくれないのでフラグメンテーション起こして
連続したアドレスが確保出来なくなると、それで終わり、どうしようもない
32bitプロセスだと4GBしか空間がないから、まれに問題になる
64bitプロセスだと無尽蔵に空間があるから問題になることは現状ありえない
しかし論理アドレスの方は何にもしてくれないのでフラグメンテーション起こして
連続したアドレスが確保出来なくなると、それで終わり、どうしようもない
32bitプロセスだと4GBしか空間がないから、まれに問題になる
64bitプロセスだと無尽蔵に空間があるから問題になることは現状ありえない
511デフォルトの名無しさん
2016/04/22(金) 23:54:45.31ID:imh5rD9T >>510
> 結局のところ、物理アドレスのフラグメンテーションはMMUが勝手になんとかしてくれるからあまり問題にならない
MMUってのはアドレス変換するハードウェア
勝手に物理メモリを仮想メモリにマップしたりはしない
それをやるのはOS
> 結局のところ、物理アドレスのフラグメンテーションはMMUが勝手になんとかしてくれるからあまり問題にならない
MMUってのはアドレス変換するハードウェア
勝手に物理メモリを仮想メモリにマップしたりはしない
それをやるのはOS
512デフォルトの名無しさん
2016/04/23(土) 00:19:34.35ID:43LRl8T1 そもそも、ページサイズより粒度が細かいフラグメンテーションにはMMUはなんの効果もないしな。
513デフォルトの名無しさん
2016/04/23(土) 05:06:22.41ID:TwuNXQH0 autorelease()呼んだらコアダンプ糞osがwww
514デフォルトの名無しさん
2016/04/23(土) 18:49:46.90ID:RPK9BpXO 小さな粒度のフラグメンテーションは気にする必要ない
4KBならUTF-16で2000文字ぐらいしかない
32bitビットマップなら32x32ほとのサイズ
4KBならUTF-16で2000文字ぐらいしかない
32bitビットマップなら32x32ほとのサイズ
515デフォルトの名無しさん
2016/04/23(土) 20:33:25.39ID:PodTlhvX キャッシュヒット率が落ちそう(コナミ)
516デフォルトの名無しさん
2016/04/24(日) 01:18:30.93ID:9YSuZOIq517デフォルトの名無しさん
2016/04/24(日) 01:38:34.87ID:ai61/62A518デフォルトの名無しさん
2016/04/24(日) 08:38:51.73ID:65va2BTL メモリー512バイトでどうやってヒープを使えと。
519デフォルトの名無しさん
2016/04/24(日) 09:31:32.99ID:HSA/nLEW ネイティブコードが必要な場面で中途半端に GC に頼るのが問題なのかもしれないが、もうネイティブコードが必要な戦場は限られた一部だけになってて、主戦場では GC は大前提の技術なんだから必要ないとか言われましてもですわ。
520デフォルトの名無しさん
2016/04/24(日) 10:14:15.47ID:W23a3TIA ページがスカスカになっても大丈夫
1ページ4KBとかだからね、十分小さい
32x32-32bitビットマップより小さい
最近のゲームで使われるような大きなサイズのテクスチャなど
でかいサイズを確保する場合はどうせ新しいページが割り当てられるし
小さなサイズを確保する場合は、スカスカになったページから空いているところを探して割り当てられるので
問題ない
1ページ4KBとかだからね、十分小さい
32x32-32bitビットマップより小さい
最近のゲームで使われるような大きなサイズのテクスチャなど
でかいサイズを確保する場合はどうせ新しいページが割り当てられるし
小さなサイズを確保する場合は、スカスカになったページから空いているところを探して割り当てられるので
問題ない
521デフォルトの名無しさん
2016/04/24(日) 10:14:59.78ID:TFb7efu7 androidしか知りませんみたいな事言われてもな
522デフォルトの名無しさん
2016/04/24(日) 10:27:10.54ID:W23a3TIA 物理アドレスはページサイズで切り売りされるので
元から連続しているアドレスは必要ではなく
フラグメンテーションは問題にならない
連続したアドレスが必要になるのは論理アドレスのほうであり
32bitプロセスでは4GBしか空間がないから問題になることがある
64bitプロセスであれば現状問題にならない
元から連続しているアドレスは必要ではなく
フラグメンテーションは問題にならない
連続したアドレスが必要になるのは論理アドレスのほうであり
32bitプロセスでは4GBしか空間がないから問題になることがある
64bitプロセスであれば現状問題にならない
523デフォルトの名無しさん
2016/04/24(日) 10:37:41.02ID:65va2BTL 実はQtでデーモン作って動かしてるのだが、もう半年以上動き続けてる。
まさかこんなに問題が起きないとは。
案ずるより産むがやすしですぞ皆の衆。
まさかこんなに問題が起きないとは。
案ずるより産むがやすしですぞ皆の衆。
524デフォルトの名無しさん
2016/04/24(日) 10:58:37.83ID:65va2BTL Qtで作ったのは一日ででっち上げる為だったのだが、意外なことに堅牢に動き続けてる。
525デフォルトの名無しさん
2016/04/24(日) 12:08:49.17ID:HSA/nLEW Qt でデーモン?
GUI が必要なデーモン?
GUI が必要なデーモン?
526デフォルトの名無しさん
2016/04/24(日) 12:13:06.27ID:ynYywbEh >>525
デーモンは通常フォアグラウンドじゃないのでUIを持ちませんぜ旦那。
デーモンは通常フォアグラウンドじゃないのでUIを持ちませんぜ旦那。
527デフォルトの名無しさん
2016/04/24(日) 12:25:33.24ID:HSA/nLEW ならば何に何故どのように Qt を使うのだ?
528デフォルトの名無しさん
2016/04/24(日) 12:45:58.38ID:TFb7efu7529デフォルトの名無しさん
2016/04/24(日) 13:02:46.55ID:ynYywbEh 等と意味不明な供述をしており。
530デフォルトの名無しさん
2016/04/24(日) 14:52:01.10ID:fu8W/E1c531デフォルトの名無しさん
2016/04/24(日) 14:52:56.88ID:UKiBgwvV daemonじゃなくてdemonなんじゃない?
デスクトップマスコット的な
デスクトップマスコット的な
532デフォルトの名無しさん
2016/04/24(日) 14:59:36.53ID:ynYywbEh 俺が作ったのはウェブソケットによってサービスを提供するプログラムだ。
エンジンエックスをリバースプロキシとした。
このプログラムは常時数千の接続から大量のリクエストを受け付ける。
接続してくるクライアントは専用に作られQtで書かれている。
大量のリクエストはそれぞれ複数のデータベース検索を引き起こす。
こう書くと結構負荷が高そうなのだが、さすがC++、ほとんど塵程度の負荷しかなく、
当然のことながらリプライに遅延もない。
そこで案ずるよりも生むが易しというわけ。
Qtは出自からしてGUIのためのライブラリではあるのだが、GUIが無いと使えないというわけでもない。
むしろボリュームからすれば、GUI以外の方がより大きい。
そして、半年動きっぱなしで大丈夫ことからして、実は断片化は気にしなくても
良さそうだ。
エンジンエックスをリバースプロキシとした。
このプログラムは常時数千の接続から大量のリクエストを受け付ける。
接続してくるクライアントは専用に作られQtで書かれている。
大量のリクエストはそれぞれ複数のデータベース検索を引き起こす。
こう書くと結構負荷が高そうなのだが、さすがC++、ほとんど塵程度の負荷しかなく、
当然のことながらリプライに遅延もない。
そこで案ずるよりも生むが易しというわけ。
Qtは出自からしてGUIのためのライブラリではあるのだが、GUIが無いと使えないというわけでもない。
むしろボリュームからすれば、GUI以外の方がより大きい。
そして、半年動きっぱなしで大丈夫ことからして、実は断片化は気にしなくても
良さそうだ。
533デフォルトの名無しさん
2016/04/24(日) 15:05:02.69ID:ynYywbEh ちなみにQt使ってなかったら一日でサービスを書き上げることは不可能だっただろう。
Qtは、その他のGUIライブラリ同様バグが多いのだが、GUIを抜いてみるとどうだろう、
意外なほどに堅牢なのだ。
何しろもう半年動きっぱなし。
俺はこの経験から一つの予測を立てた。
これからのサービスは、C++で書かれるようになる可能性がある。
何しろ圧倒的に速い。
一つのリクエストに対するレスポンスが速いため、平均負荷率が圧倒的に下がるのだ。
この事実に世の中が気づくにはそう時間がかからないはず。
そしてsystemdがこの動きを促進するはず。
ちなみにWindowsで書いてLinuxで動かしてます。
Qtは、その他のGUIライブラリ同様バグが多いのだが、GUIを抜いてみるとどうだろう、
意外なほどに堅牢なのだ。
何しろもう半年動きっぱなし。
俺はこの経験から一つの予測を立てた。
これからのサービスは、C++で書かれるようになる可能性がある。
何しろ圧倒的に速い。
一つのリクエストに対するレスポンスが速いため、平均負荷率が圧倒的に下がるのだ。
この事実に世の中が気づくにはそう時間がかからないはず。
そしてsystemdがこの動きを促進するはず。
ちなみにWindowsで書いてLinuxで動かしてます。
534デフォルトの名無しさん
2016/04/24(日) 15:05:44.58ID:ai61/62A 一例をもって一般化はできないだろ
535デフォルトの名無しさん
2016/04/24(日) 15:05:53.54ID:TFb7efu7536デフォルトの名無しさん
2016/04/24(日) 15:08:01.90ID:ynYywbEh Windowsで書いてLinuxで動かすことに、systemdは大いに貢献した。
従来のデーモンの作り方では、いろいろ煩雑なことがありすぎ、時間の制限から難しかっただろう。
Qt+systemd、この直観的な選択は大成功であった。
従来のデーモンの作り方では、いろいろ煩雑なことがありすぎ、時間の制限から難しかっただろう。
Qt+systemd、この直観的な選択は大成功であった。
537デフォルトの名無しさん
2016/04/24(日) 15:11:43.89ID:ynYywbEh Qtのバグの多くは、複数の環境に対応するため、その差異によって引き起こされているという結論を得た。
systemd万歳!
systemd万歳!
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★7 [BFU★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★8 [BFU★]
- 【千葉】コンビニに尿入りペットボトル並べた疑い、26歳男「むしゃくしゃして」…購入した客が飲もうとしたところ臭いに違和感 [ぐれ★]
- 高市首相が異例の“買春行為の罰則化の検討”に言及…世界では“買う側”に罰則を科すのが先進国のスタンダード ★2 [樽悶★]
- 植田日銀総裁 「円安進行が物価高を起こしている」 ★4 [お断り★]
- 中国官製報道「日本経済はもう持たない」にネット民ツッコミ「ニュースだけ見てたら日本はもう百回くらい爆発してる」 [1ゲットロボ★]
- 1か月前の石破前首相、今は戦前か戦後かと聞かれ「戦前にしないようにするのが我々政治家の仕事」 [931948549]
- 【画像】高市の経済政策、凄すぎるwww [237216734]
- 現役JKのお茶会スレ( ¨̮ )︎︎𖠚ᐝ158
- (*´ω`*)明日の映画なんだけど人数分チケット取っといて!( ・᷄ὢ・᷅ )わかった!みんなで映画行くの楽しみ!
- 【ガチ正論】一般人「中国に規制制裁されて、『中国ムカつく』じゃなくて矛先が『許さんぞ高市』になってる奴、頭おかしいの?」 ★2 [153490809]
- カービィのエアライダーやってるけど泣ける
