X



GCは失敗。メモリは自分で管理せよ! その2©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
垢版 |
2015/11/18(水) 23:24:59.79ID:BUQ68wTG
GC、ガベージコレクション、ガベージコレクタ、ガーベジコレクション、ガーベジコレクタは使えない。
以下GCと記す

プログラマをメモリ管理から開放する!
といいつつ、メモリリーク問題の文献が大量にある。
これすなわち、メモリリーク問題が全然解決していないということ。
さらに、メモリ解放のタイミングの文献まで大量に生み出した。
これすなわち、新たなるメモリ管理に関する問題を生み出したということ。

malloc、freeじゃないが
結局のところ、メモリを管理するという技術は、今しばらくは、身につける・教える・学ぶべきではないだろうか?
使って、そのまま放置しても、基本的にはGCがなんとかしてくれている。
ランジョブからジョブ終了までさほどの時間を要さない。メモリも大して使わないならいいだろう。
しかし、規模が大きくなり常駐ジョブやメモリ大量使用のジョブになってくると、そんなメモリ管理の方法でやっていると、
上記「文献」を生み出されてしまう。

入門時は、メモリに無頓着でもいいだろう。それよりも、目的を達成することが先決だ。
しかし、慣れてきたら、やはりメモリの管理まで余裕を持って自分で行うべきだろう。

前スレ
GCは失敗。メモリは自分で管理せよ!
http://peace.2ch.net/test/read.cgi/tech/1412986420/
0570デフォルトの名無しさん
垢版 |
2016/07/16(土) 10:10:08.78ID:+8wH/95N
>>565
別に
単方向リストでもなるだろJK

ていうかリストの要素をshared_ptrにするのは現代でも有効
リストのリンクヘッダ自体の寿命は要素が明示的にdeleteされるかリスト全体が廃棄されるまでなので
リンクヘッダも管理したければリスト固有のストレージ丸ごとな単位でshared_ptrにしたら良い、
希ガス
0571デフォルトの名無しさん
垢版 |
2016/07/16(土) 10:13:41.67ID:+8wH/95N
△: リストの要素
○: リストの要素が保持するデータ

つか開放タイミングをshared_ptrに任せておk、などという発想のは管理しているうちに含めれないがな…
0572デフォルトの名無しさん
垢版 |
2016/07/16(土) 10:38:52.53ID:6AR6MH2z
一般のグラフじゃなくてリスト構造の話だろ?
双方向リストはheadとtailへの参照があるが、単方向リストで循環参照は生じようがないが。
0573デフォルトの名無しさん
垢版 |
2016/07/16(土) 11:51:50.13ID:+8wH/95N
>>572
すまんの>>570の単方向リストは正確には循環リストもしくは環状リストと呼んだ方が良いかも試練、

だが、循環リストもしくは環状リストも単方向リストの実装方式の一つではある(初期の『プログラミング言語C++』か何かのslist等
のじゃ…!
0574デフォルトの名無しさん
垢版 |
2016/08/22(月) 17:06:41.08ID:oW9zLe2W
循環してるかは後付けでオブジェクトをマークすれば判るんだし
扱うデータ構造から可能性の有無は予測できるし循環自体は大した問題じゃないよ
あ、これリークするなと思ったら対策すればいいだけ
問題は他人様のブラックボックスなライブラリを使う場合
0575デフォルトの名無しさん
垢版 |
2016/08/22(月) 19:24:37.36ID:csr3LedD

今の議論はプログラマーが何も考えないアホでもGC(言語)使ってれば問題無いのか
そうでなければ結局なんらかの管理が必要でちゃんとする事しないとリークするから本質的には管理から開放されないよねって話だと思うが
0576デフォルトの名無しさん
垢版 |
2016/08/22(月) 19:33:58.37ID:01M+MFvA
いまどきの子はブラウザアプリしか作れないから
ブラウザ再起動とかページ遷移で解決でしょうな
0577デフォルトの名無しさん
垢版 |
2016/08/23(火) 19:56:22.47ID:cEt4cHHx
現在のGCが不完全なだけであって、
メモリは人が管理すべきでないという考え自体は正しいよ。
0578デフォルトの名無しさん
垢版 |
2016/08/23(火) 20:17:10.56ID:xIKUFX4H
潤沢なメモリを用意してGCしない戦略
起動時間に限ってGCしなくても問題ない範囲であればGCしない戦略
結局こういうのが勝つ
0580デフォルトの名無しさん
垢版 |
2016/08/24(水) 13:32:09.69ID:2RMcAgaj
本当の意味での軽量プロセスをOSがサポートしてくれたら良いんだけどね
メモリプールみたいなもんなんだけど、OSのリソースも紐づいてて
メモリプール解放時にOSのリソースもちゃんと解放されるようなもの
マルチプロセスは非常に強力で良いんだけど
メモリ空間が別になるから色々面倒だしパフォーマンスも出にくい

世の中には呼び出したらしばらく処理が返ってこない時間のかかる関数があるけど
とうぜんUIが固まったら困るから別スレッドで実行するわけだけど
処理中にユーザーがキャンセルボタンを押したとき
処理を中断する手段が関数側に用意されてなかったりすると、困る
外からスレッドごと殺しても、リソースリークの問題が出る
真っ先に困るのが同期オブジェクト
同期オブジェクトを握った状態で死なれると、それ以降デッドロックを引き起こす
それ以外にも、プログラムの整合性が壊れているかもしれないので、以降正しく動く保証がない

だから別プロセスで実行して、キャンセルされたときはプロセスごと殺すしか方法が無い
しかし別プロセスにするとメモリ空間が繋がってないので面倒
だからその中間がほしい
0581デフォルトの名無しさん
垢版 |
2016/08/24(水) 16:03:33.76ID:Ku8YOB4B
erlang最強
0582デフォルトの名無しさん
垢版 |
2016/08/24(水) 19:53:51.27ID:B7v3wZLf
軽量プロセスより重量スレッドの方が実現できそう。
0583デフォルトの名無しさん
垢版 |
2016/08/24(水) 20:02:24.36ID:971rg3P3
いつ無くなってしまうかわからんようなメモリのアクセスが簡単になってもほとんど使いみちないだろ。
安全性重視なら別プロセスにして、必要なデータだけ共有メモリで受け渡してのが妥当なところだろう。
0588デフォルトの名無しさん
垢版 |
2016/08/25(木) 11:39:37.19ID:rs2QvvZe
元々はスレッドが軽量プロセスって呼ばれていたりしたんだがな(アドレス空間の切り替えが不要だからプロセスより切り替えが軽い)

まあそれはおいておいて
forkを使うと軽量プロセス?とやらの機能が実現できるらしい理屈がわからない
forkしたら別プロセスだぞ?
vforkとかなら実行直後は共有しているけど変更を加えた時点で分かれるし

まあどちらにしろGCじゃメモリーをはじめとする資源管理からは完全には解放されないって事だ
0589デフォルトの名無しさん
垢版 |
2016/08/25(木) 11:59:23.81ID:8gaIkILP
メモリ空間がつながっていること自体はそれほど考慮してないんよ
単にWindowsはマルチプロセスがしにくい
forkあったらちょっとした処理を別プロセスで実行するの、便利じゃん
片づけはプロセスごと殺して終わりだし
0594デフォルトの名無しさん
垢版 |
2016/11/14(月) 22:33:26.01ID:A2iFoZHP
固定領域として静的にグローバル変数化、バッファ化すればいいだろ、
それを汚い言うやつがいるが、

潜在BUGだらけでどうにもできないそれのほうが汚いわ。
0596デフォルトの名無しさん
垢版 |
2016/11/14(月) 23:59:22.37ID:f4osfHdm
そういう発想、嫌いじゃないよ
静的にできるものは、なるべく静的にすべし
俺もそう思う
妙なからくりじみたことにはもう興味が湧かなくなった
最初のころはGCのメカニズムが面白いと感じていたが、もうそういうの、無い

いかに静的にシンプルに書くか、こっちのがパズルみたいで面白い
すべての事は明確であるべきで、コードはそのようになっているべきだ、と
俺が特に嫌いなのは、何がどの順番に実行されるか、コードを見ただけで
よくわからない類のプログラムだ
コールバックも基本的に嫌いだ
なのでいつ実行されるか分からないマークスイープGCは好きではない
参照カウンタ方式のほうが根本的に安全であり、シンプルであると思う
というのも参照カウンタ方式のGCはバグの再現性があるから
唯一の問題は循環参照だが、これも弱い参照を使えば解決する
たったそれだけの工夫でマークスイープGCの複雑な仕組みがいらなくなるなら
おれはそちらのほうが良いと考える
開放するというただそれだけのことに、あれだけ巨大な仕組みが必要になるのはおかしい
0597デフォルトの名無しさん
垢版 |
2016/11/15(火) 00:00:47.13ID:PldPJ2O3
マークスイープ系GCはメモリ管理に関しては完璧かもしれないが
それ以外のリソースの面倒は一切見てくれない
そういったものはファイナライザで開放すればよいわけだが
要らなくなったらすぐさま開放してほしい時に困るので、例えばC#ではDisposeを用意している
しかしながら根本的に本当にDisposeを呼んで良いのかは誰にもわからない部分がある
もしかしたら他の誰かが使用中かもしれない、という場面もありうる
だから誰も使ってないことをプログラマが保証する格好になる
その意味ではfree()と大差ないわけで
usingという構文が用意されていて、ある程度自動で呼ばれるというだけである
本当に誰も使ってないことを保証するにはマークスイープを走らせなければわからない
しかしマークスイープはコストがかかるので、そんな都度都度気軽に走らせられない
その点、参照カウンタ方式は参照カウンタを見るだけで使われているかどうかわかるので
都度都度チェックできるし、要らなくなったらその場で即開放できるので
Disposeのような仕組みもいらず、解放処理をデストラクタに一本化できるし
スマポを使えばデストラクタ自体、書く必要すらないかもしれない
そして有り難いことに、デストラクタはメンバ変数やベースクラスに対しても
芋づる式に自動で呼ばれる
これはDisposeには無い機能だ
何故無いのか?答えは、勝手にDisposeして良いのかどうか、コンパイラは判断がつかないからだ
誰か他の人が使っているかもしれないわけで、勝手にDispose出来ない
Disposeして良いかどうかはプログラマが保証しなければならないので自動化できないのだ
0598デフォルトの名無しさん
垢版 |
2016/11/15(火) 00:02:48.22ID:PldPJ2O3
本当にC#で解放処理をまともに書こうと思うと
自身のクラスのメンバ変数にIDisposableを実装しているものがあるかどうかを調べ
もし、実装しているものがあれば、自身もIDisposableにし
Disposeメソッドを作り、その中で、先ほど調べたメンバのDisposeを呼び出さなければならない
これを手作業でやる
C#をやったことのある人なら知っている通り、マイクロソフトの示すIDisposableの実装例自体が
非常に煩雑であるわけだが、ともかく、もれがないように、手作業で頑張る
まず、IDisposableかどうか調べ忘れるだろうし、Disposeの呼び出し忘れもありうる
mallocしたらfreeしましょうと同レベルのことを強いられる
このように面倒なIDisposableであるが
IDisposableなオブジェクトをメンバに持つと、自身もIDisposableになるということは
IDisposableはどんどん伝染していくわけで、手動でDisposeしまくるコードを書き続ける羽目になる
このように、まじめに考えると、破たんした方法であることが分かる
根本の問題はDisposeが自動で呼ばれるコードをコンパイラが生成してくれないこであるが
確実にDisposeして良いかどうかを判断するためにはマークスイープを走らせる必要があるので
どうやっても自動化は困難であり、プログラマが開放してよいことを保証するという
ある種手作業なusingがせいぜいである
参照カウンタ方式であれば、ほぼノーコストで開放して良いかどうか分かるので
これらの問題は一切発生しない
解放処理はデストラクタ一本であるし、芋づる式に自動的に呼ばれるので
手動でコードを書かなければならないということもない
ランタイムもシンプルであり、バグった時も再現性が期待できる
0599デフォルトの名無しさん
垢版 |
2016/11/15(火) 00:24:03.03ID:PldPJ2O3
これがC++が未だにかたくなにマークスイープ系GCを搭載しない理由である
C++を書くプログラマはweak_ptrを適切に使えるものだという前提のもとに
マークスイープ系GCにまつわる数々の問題点を排除したのだ
マークスイープ系GCで有利なのは唯一循環参照だけであり
そこさえ気を付けることができれば
それ以外の部分に関しては参照カウンタのほうが優れている
C++は別に時代遅れなわけじゃなく、そういう選択をしたというだけ
今になって考えるとその選択は正しかったと思う
0600デフォルトの名無しさん
垢版 |
2016/11/15(火) 04:04:15.16ID:9A/eUvIY
メンバーにdisposeしなければならないような設計が良くない。そんなものはメソッド内のローカル変数に止めるべき。
それすらも理解できず(考え付かず)にただ一律なんにでも同じ考え方を押し込むのはただの愚行。
ありもしない、回避可能な杞憂をただ恐れるのは、勉強不足か進歩が止まっているだけ。
だから皮肉を込めて老害と呼ばれる
0601デフォルトの名無しさん
垢版 |
2016/11/15(火) 04:09:46.64ID:9A/eUvIY
日本語おかしかった。
メンバーにdisposeしなければならないような物を持たせるのが良くない
でした。
0604デフォルトの名無しさん
垢版 |
2016/11/15(火) 08:18:37.29ID:wcWx6QZb
>>600-601
よくないって言われてそうせざるを得ない場合はいくらでもあるしなぁ
例えば動的に出力先を切り替えられるログクラスみたいな奴をどう書けと言うんだろ?
0605デフォルトの名無しさん
垢版 |
2016/11/15(火) 09:05:11.25ID:P8K+NdWV
>>597
スマポとデストラクタの必要性は関係ないだろ…
deleteの必要がない、とか、デストラクトを考えなくて良いってことだと思うけど。
0607デフォルトの名無しさん
垢版 |
2016/11/15(火) 10:53:43.30ID:PldPJ2O3
struct test
{
  std::shared_ptr<int> ptr;
  test(){ ptr = new int; }
};

上のコードはデストラクタを書く必要があるのかないのか
スマポを使えばデストラクタを書かなくてよい場合もあり得るということ
スマポを使わないのであれば当然デストラクタでdeleteをしなければならないだろう
なので、「スマポ」と「デストラクタを書く必要性」は、関係がある

ちなみにC#のDisposeはただのメソッドであるので
このような芋づる式にメンバ変数のDisposeを呼び出してくれる機能はないし
マークスイープなので原理上不可能である
他で使用中でないことをプログラマが保証しないとにはDisposeは呼べないので
自動化できない
0610デフォルトの名無しさん
垢版 |
2016/11/15(火) 13:34:38.18ID:bbRnuBLg
グローバルが嫌われたのは
疑似マルチプロセスでメモリを共有していた時代の汚物だろ
今みたいなOSのメモリ管理ならアプリ単位グローバル常套
0613デフォルトの名無しさん
垢版 |
2016/11/16(水) 12:42:03.97ID:KQ3Yixih
>>612
Write する度に WriteTypeA とかを生成/破棄するってこと?
ログとかならその方が望ましいケースもあるかもしれないけど、例えば性能上の問題でストリームは開きっぱなしにしたいとかもあるでしょ
0614デフォルトの名無しさん
垢版 |
2016/11/16(水) 14:56:37.10ID:a2T+Z3SD
>>613
開きっぱなしにしたいスコープは?
スコープを一つのメソッドにして、同じようにすればいいじゃない

コードが必要なら夜にでも書くよ
0615デフォルトの名無しさん
垢版 |
2016/11/16(水) 19:17:42.21ID:KQ3Yixih
>>614
スコープを動的に変えたい場合を想定してるんだが
実行中にログファイルを変更できるアプリケーションとか見たことないの?
0616デフォルトの名無しさん
垢版 |
2016/11/16(水) 23:34:22.54ID:EhKul/vA
>>615
ログファイルであれば日付で切り替えとかあるね。

そしたらストリーム開きっぱで日付が切り替わったら、閉じて新しいの開き直すとかあるわ。

いつもlog4とか使って主処理と切り離してたから考慮から抜けてたわ。

俺の意見はdb接続とかで一部にしか当てはまらんので、
「基本的には」とか
「リソースを管理する必要があるもの」とか前提がつくね。すまん。
0617デフォルトの名無しさん
垢版 |
2016/11/19(土) 06:41:14.49ID:4ie0coBz
ログファイルはログが確実に記録されるのが使命であって性能は二の次なのだよ
よって開きっぱなしは論外
性能で問題が出るなら吐く量を調節すればいいだろう
0620デフォルトの名無しさん
垢版 |
2016/11/19(土) 10:16:22.36ID:HaGDkE41
>>618
アプリケーションエラーとか異常終了した時にバッファされてる内容が書かれないことがあるから
異常終了した時はまさにそのエラーになる直前のログが欲しいのに〜
ってなる w

ただログってそういうログばかりじゃないし Apache のアクセスログみたいにいちいち閉じてたら全然間に合わないって現実を知らない >>617 はもう少し経験積むまで黙ってた方がいいと思う
0623デフォルトの名無しさん
垢版 |
2016/11/19(土) 14:34:26.96ID:WWFUnGVk
とこのように、相手を互いに見当違いであると罵り合うのであった
しかし、それは正しい
両者とも正しい
0625デフォルトの名無しさん
垢版 |
2016/11/19(土) 21:51:13.35ID:WZ8TOo4I
null安全をアピールしてる人間はObjCerから見ると補助輪付き自転車を渡してきてこれ安全だから絶対に乗れよと言ってくる頭おかしいおじさんにしか見えない
Swift移行がこじれるだけだから黙っといて欲しい
0626デフォルトの名無しさん
垢版 |
2016/11/21(月) 14:59:21.88ID:qSFgYSXv
浜矩子・著
『アホノミクス完全崩壊に備えよ』
『どアホノミクスへ最後の通告』
『みんなで行こうアホノミクスの向こう側』


抑制のない成長に基づく経済政策は終焉

日本国民はどう対処すればいいのか。
新しい政権は民意を反映し、
食糧、住宅、健康、教育、最後に防衛です。
国民の意志を裏切ることは、
極端な場合、自殺や殺人にまでつながります。
民衆の指導者は
職業的政治家ではない人々から見つかるのです。

世界平和の脅威は、
イスラエル、イラン、アメリカです。
イスラエルの役割は跪いて、
パレスチナに許しを請うことです。
アメリカによる他国の虐待に
反対の声を上げなければなりません。
彼らは今世紀(21世紀)を
この帝国が出来上がるアメリカの世紀と呼ぶ。
しかし、そうはならないでしょう。
彼らが世界中に‘民主的’制度を確立したい
という衝動(世界を支配する)をコントロール
するのは、マイト レーヤの任務です。

非常に間もなく
マイト レーヤをテレビで見るでしょう。
彼は「匿名」で働いております。
0627デフォルトの名無しさん
垢版 |
2016/12/08(木) 09:10:56.35ID:FEYStmIt
小規模ならGCのメリットは大きいのかもしれないが、大規模または大量にメモリを食うプログラムにはGCは向いてないのではないか。

あんまり例を知らないが、JAVAで動くマインクラフトのデバッグ画面でメモリ使用量みたら、めまぐるしく増加して一気に減ってるのみてびっくりした。
0628デフォルトの名無しさん
垢版 |
2016/12/13(火) 13:02:48.84ID:XUF2n21y
GC周りに付いて書かれたネットの記事読んできたけど
オブジェクトが生成されては次々と死んでいき
生きてるオブジェクトより死んだオブジェクトが多い場合の方が速くなるっぽい

>>627
そう考えると長命のオブジェクトが大量にある方が(性能的には)問題だが
マインクラフトがそれかは知らない
0630デフォルトの名無しさん
垢版 |
2017/01/18(水) 11:38:56.79ID:A+XqqRn6
漏れたときの調査が大変
安心してると痛い目にあう
0631デフォルトの名無しさん
垢版 |
2017/01/20(金) 16:23:16.03ID:4Q3o1w03
参照カウントは循環参照の問題が起こるだけじゃなくて
意外と遅いって聞くけどマジで?

・メモリをOSから直接確保・解放するのは意外と遅い
・マルチスレッドで参照カウントを使うにはアトミックな操作が必要
・カウントを自動化すると不必要な参照カウントが起こる
とかで

対してトレーシングGCの弱点は回収時に止まる時間が長いところか

その対策か、V8やOracle JavaにはGCの時間を制限する機能があるみたいだが
それってどうなんだ?
0633デフォルトの名無しさん
垢版 |
2017/01/22(日) 15:00:56.26ID:lyHWqZIh
^ナマポ
0634デフォルトの名無しさん
垢版 |
2017/01/22(日) 18:20:35.13ID:CvVvUjG5
ストップ・ザ・ワールドの問題さえなくなればGCが最強ってこと?
0636デフォルトの名無しさん
垢版 |
2017/02/20(月) 19:16:44.90ID:NKdiRgAe
バイオハザード7は28万行のC#コードでできててビルド10秒らしい。
独自VM、独自GCだとか。
0639デフォルトの名無しさん
垢版 |
2017/05/26(金) 12:05:46.50ID:uY9cFHyF
>>638
FrameGCはゲームというかRTSに特化したGCだね

・ローカルに発生したオブジェクトは溜め込んでフレームの終わりにまとめて開放する
・グローバルに結びついたオブジェクトにはカウンタGCを適用する
・フレーム毎に循環参照のチェックを少しずつ行う

ざっくりこんな感じ?
0640デフォルトの名無しさん
垢版 |
2017/05/26(金) 20:16:13.14ID:0194UVlm
内部的にC#をC++に変換してるからC#をスクリプト的に使ってるだけで実質C++だな。当然GC・メモリアロケータ周りも身内実装。
0641デフォルトの名無しさん
垢版 |
2017/05/26(金) 22:20:13.64ID:uY9cFHyF
>>640
C++のスマートポインタみたいな形で実装できるのかな?
俺は検討してみたけど無理だったw
0644デフォルトの名無しさん
垢版 |
2017/09/11(月) 12:41:54.43ID:YXmvV/7e
「メモリ」+「フラグメンテーション」で検索すると色々と詳しい話が出てくるね。
0645デフォルトの名無しさん
垢版 |
2017/09/11(月) 13:14:06.52ID:YXmvV/7e
ここが分かりやすかった

ttps://www.uquest.co.jp/embedded/learning/lecture17.html
ttp://www.kaede-software.com/2015/06/post_655.html
0646デフォルトの名無しさん
垢版 |
2017/09/11(月) 13:44:59.20ID:I3u+9T/v
メモリのフラグメンテーションなど実質的には気にする必要は全くない
なぜなら現実のコンピュータにはMMUが付いてるから
物理メモリの連続空間が枯渇することは考えなくてもよい
あり得るとしたら32bitプロセスでの論理アドレスの連続空間の枯渇であるが
64bitプロセスにすれば問題ない
もともと論理アドレス空間が枯渇するかもしれないほどメモリを使うのなら
64bitプロセスにするのが当たり前なので・・・
というわけでメモリのフラグメンテーションは気にしなくてよい
CPUのキャッシュのヒット率を上げるとか、そういうことでなければ
0647デフォルトの名無しさん
垢版 |
2017/09/11(月) 17:53:09.29ID:P5pczjP2
そうなん?
ガベコレの回収効率が悪くなって
無駄な使用領域が増えて枯渇しやすくなるんじゃね
0649デフォルトの名無しさん
垢版 |
2017/09/11(月) 20:33:05.66ID:I3u+9T/v
程度の問題であって
世のプログラムがフラグメンテーションなど気にせずとも
普通に動いているのを見てわかる通り、問題になってない
MMUがあるから
0650デフォルトの名無しさん
垢版 |
2017/09/11(月) 21:54:05.93ID:khvQxUtn
>>646
そういうぬるい環境で済むところもあればそうじゃないところもある
ゲームコンソールだと物理メモリサイズに最適化するからな
STLとかdefault allocatorで気軽に使ってヒープ汚しまくってると
そのうち物理メモリ足りなくなってページアウト
0651デフォルトの名無しさん
垢版 |
2017/09/12(火) 10:09:32.99ID:g0xsLkF6
必ず来ると思った、その反論
しかし、稀な事例を持ち出して、どうこう言っても仕方がない
0653デフォルトの名無しさん
垢版 |
2017/09/12(火) 13:22:19.16ID:crCgFvVY
フラグメンテーションはアドレス空間や実メモリ量が限定される環境をどううまく使うかの話だから
MMUがあって64bit空間なら平気と言われてもな
0654デフォルトの名無しさん
垢版 |
2017/09/13(水) 03:53:58.25ID:TAF2DPKT
そそ、複雑なプログラムって書こうと思えばいくらでも複雑化するからな。
で、簡潔で高度と思われる機能を追加していくほど難易度は指数関数的に増大するし。
0655デフォルトの名無しさん
垢版 |
2017/09/13(水) 05:10:44.22ID:t818hmCa
でも実際スマホアプリ作ってんのにフラグメンテーションを防ぐ為に最初に使用する分全部確保しておいて、その中で割り当てするんだーとかいって、オレオレアロケーター作ろうとする頭の悪いやつがいて困る。
逆にお前の作ったそのアロケーターの中でフラグメンテーションして枯渇するわと。
0656デフォルトの名無しさん
垢版 |
2017/09/13(水) 07:42:12.50ID:7O+lQKpp
組み込みなんかでよくあるそういうのは、どっちかというと最初に確保したメモリ以上を
使用しないことを保証するためにやるもんだろう。
0657デフォルトの名無しさん
垢版 |
2017/09/13(水) 08:52:01.48ID:Vaq5SeW/
アロケータ置き換えるだけでは普通解決しないでしょ
>>655 こそが置き換えて何するのか理解できてない気がする
0659デフォルトの名無しさん
垢版 |
2017/09/17(日) 13:06:26.21ID:S40DCpdn
いくら64bitあっても設計が雑ならメモリ枯渇するでしょ
ページング方式でメモリ消費されてんだし
0660デフォルトの名無しさん
垢版 |
2017/09/17(日) 13:32:06.14ID:2kxiy1Rb
MMUのアドレス変換コストもタダじゃない。
TLBキャッシュ外れたら遅くなる。
0661デフォルトの名無しさん
垢版 |
2017/09/17(日) 13:32:07.34ID:S40DCpdn
1回のメモリ取得で4kづつ消費されるわけか
0662デフォルトの名無しさん
垢版 |
2017/09/17(日) 13:49:19.58ID:S40DCpdn
ツリー状のメモリ管理するとあっという間にメモリ無くなるな
class CTree{
std::vector<CTree>;
};
とか
0663デフォルトの名無しさん
垢版 |
2017/09/17(日) 14:00:55.72ID:S40DCpdn
こうするとさらにメモリが消えていくな
class CTree{
std::map<std::string,CTree>;
};
0664デフォルトの名無しさん
垢版 |
2017/09/17(日) 14:12:30.87ID:S40DCpdn
間違えた。

class CTree{
std::vector<CTree> m_Tree;
};

class CTree{
std::map<std::string,CTree>m_Tree;
};

で、ツリーのノード一つ毎に上は4kづつ下は8kづつメモリを消費するわけで・・・
0665デフォルトの名無しさん
垢版 |
2017/09/17(日) 15:23:52.56ID:iyMogwhx
一回のメモリ取得で4KBってのが嘘だから意味が無い話だね
MMUついてたって、そんなアホな実装は無い

4KBだかの1ページ分の中での細かなメモリ断片化はおおむね無視できる、ということ
メモリ断片化で困るのは大きなサイズのメモリを確保しようと思ったとき
連続したアドレスが確保できなくてコケる、ということだからね
これに対してMMUは有効ということ
メモリが断片化で多少無駄遣いされる分にはスワップしてでも動くから

そんでこれは程度問題
大概の場合は問題にならない
0666デフォルトの名無しさん
垢版 |
2017/09/17(日) 15:38:01.00ID:S40DCpdn
https://ja.wikipedia.org/wiki/動的メモリ確保
>また、粒度の細かいページングは、ページングテーブル
>(物理アドレスと論理アドレスの対応表)が大きくなるため、
>4KB程度の大きなブロック単位でしか割り当てることができない。

ウィキペディア見るとそのアフォな実装がまかり通ってると読めるんだが・・・
0669デフォルトの名無しさん
垢版 |
2017/09/17(日) 16:06:24.06ID:S40DCpdn
>>667
ちゃんとmallocやnew時のアドレス確認はしたか??かなりアフォな動作してるぞ?
まあ、多少のrealloc程度の処理なら何とかしてくれるけどな。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況