2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

GCは失敗。メモリは自分で管理せよ! その2

1 :デフォルトの名無しさん:2015/11/18(水) 23:24:59.79 ID:BUQ68wTG.net
GC、ガベージコレクション、ガベージコレクタ、ガーベジコレクション、ガーベジコレクタは使えない。
以下GCと記す

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

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

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

前スレ
GCは失敗。メモリは自分で管理せよ!
http://peace.2ch.net/test/read.cgi/tech/1412986420/

654 :デフォルトの名無しさん:2017/09/13(水) 03:53:58.25 ID:TAF2DPKT.net
そそ、複雑なプログラムって書こうと思えばいくらでも複雑化するからな。
で、簡潔で高度と思われる機能を追加していくほど難易度は指数関数的に増大するし。

655 :デフォルトの名無しさん:2017/09/13(水) 05:10:44.22 ID:t818hmCa.net
でも実際スマホアプリ作ってんのにフラグメンテーションを防ぐ為に最初に使用する分全部確保しておいて、その中で割り当てするんだーとかいって、オレオレアロケーター作ろうとする頭の悪いやつがいて困る。
逆にお前の作ったそのアロケーターの中でフラグメンテーションして枯渇するわと。

656 :デフォルトの名無しさん:2017/09/13(水) 07:42:12.50 ID:7O+lQKpp.net
組み込みなんかでよくあるそういうのは、どっちかというと最初に確保したメモリ以上を
使用しないことを保証するためにやるもんだろう。

657 :デフォルトの名無しさん:2017/09/13(水) 08:52:01.48 ID:Vaq5SeW/.net
アロケータ置き換えるだけでは普通解決しないでしょ
>>655 こそが置き換えて何するのか理解できてない気がする

658 :デフォルトの名無しさん:2017/09/13(水) 22:09:52.04 ID:PcFMQESF.net
むしろ一定時間を保証する(なのでサイズは固定長とかが多い)もんだろ

659 :デフォルトの名無しさん:2017/09/17(日) 13:06:26.21 ID:S40DCpdn.net
いくら64bitあっても設計が雑ならメモリ枯渇するでしょ
ページング方式でメモリ消費されてんだし

660 :デフォルトの名無しさん:2017/09/17(日) 13:32:06.14 ID:2kxiy1Rb.net
MMUのアドレス変換コストもタダじゃない。
TLBキャッシュ外れたら遅くなる。

661 :デフォルトの名無しさん:2017/09/17(日) 13:32:07.34 ID:S40DCpdn.net
1回のメモリ取得で4kづつ消費されるわけか

662 :デフォルトの名無しさん:2017/09/17(日) 13:49:19.58 ID:S40DCpdn.net
ツリー状のメモリ管理するとあっという間にメモリ無くなるな
class CTree{
std::vector<CTree>;
};
とか

663 :デフォルトの名無しさん:2017/09/17(日) 14:00:55.72 ID:S40DCpdn.net
こうするとさらにメモリが消えていくな
class CTree{
std::map<std::string,CTree>;
};

664 :デフォルトの名無しさん:2017/09/17(日) 14:12:30.87 ID:S40DCpdn.net
間違えた。

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

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

で、ツリーのノード一つ毎に上は4kづつ下は8kづつメモリを消費するわけで・・・

665 :デフォルトの名無しさん:2017/09/17(日) 15:23:52.56 ID:iyMogwhx.net
一回のメモリ取得で4KBってのが嘘だから意味が無い話だね
MMUついてたって、そんなアホな実装は無い

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

そんでこれは程度問題
大概の場合は問題にならない

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

ウィキペディア見るとそのアフォな実装がまかり通ってると読めるんだが・・・

667 :デフォルトの名無しさん:2017/09/17(日) 15:48:55.35 ID:iyMogwhx.net
アホだなぁ
OSレベルのメモリ確保と言語レベルのnew、mallocは別

668 :デフォルトの名無しさん:2017/09/17(日) 16:00:06.71 ID:S40DCpdn.net
こっちも参考になる
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E7%AE%A1%E7%90%86%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88
CPUによってMMUの実装が異なる点は面倒だな

669 :デフォルトの名無しさん:2017/09/17(日) 16:06:24.06 ID:S40DCpdn.net
>>667
ちゃんとmallocやnew時のアドレス確認はしたか??かなりアフォな動作してるぞ?
まあ、多少のrealloc程度の処理なら何とかしてくれるけどな。

670 :デフォルトの名無しさん:2017/09/17(日) 16:13:26.66 ID:iyMogwhx.net
mallocやnewは
大きなサイズを確保するときと
小さなサイズを確保するときで
アルゴリズムが切り替わる

671 :デフォルトの名無しさん:2017/09/17(日) 16:17:08.43 ID:iyMogwhx.net
VC++2015での実行結果

auto a = malloc( 10 );
auto b = malloc( 10 );
wchar_t tmp[ 100 ];
::swprintf_s( tmp, 100, L"a = %x, b = %x \n", a, b );
::OutputDebugString( tmp );

----------------------------------------

a = 10a4f0, b = 10a508

残念でしたね

672 :デフォルトの名無しさん:2017/09/17(日) 16:17:49.54 ID:S40DCpdn.net
MMUは多少以上の処理をすると簡単にフォールト返すのが困りもの
結局初心者レベルのプログラマしか想定してないんだよな

673 :デフォルトの名無しさん:2017/09/17(日) 16:30:36.71 ID:S40DCpdn.net
>>671
realloc使った事ある?

674 :デフォルトの名無しさん:2017/09/17(日) 16:34:30.81 ID:iyMogwhx.net
お前が残念なことと何の関係が?
あほらし

675 :デフォルトの名無しさん:2017/09/17(日) 16:37:39.46 ID:S40DCpdn.net
複雑なことをしていると、それがまるで正しいかのように思う点がアフォ
多少複雑なことをしていてもアフォな挙動をする可能性はあると考えるべき

676 :デフォルトの名無しさん:2017/09/17(日) 17:05:23.31 ID:S40DCpdn.net
malloc,newの挙動の説明ってまんまMMUの説明なんだよな
だから複雑なアルゴリズムを使われていると思うのはMMUが複雑な挙動をしているから
でも、そんなに複雑な挙動してるか??
単に過去のアプリとの互換性の問題で変な事をしているだけだぞ

677 :デフォルトの名無しさん:2017/09/17(日) 17:16:19.17 ID:S40DCpdn.net
たいがいのmalloc,newはMMU次第でいくらでも挙動が変化するからな
ちゃんとPC毎に動作確認したか??

678 :デフォルトの名無しさん:2017/09/17(日) 17:44:23.50 ID:4FsrO7aF.net
ID:S40DCpdn しったかしすぎ
mallocの挙動はヒープのアルゴリズム次第

679 :デフォルトの名無しさん:2017/09/17(日) 17:55:14.06 ID:S40DCpdn.net
malloc,newの挙動はハードとOSによって変化するという記述は見たことあるけどな

680 :デフォルトの名無しさん:2017/09/17(日) 18:02:58.95 ID:S40DCpdn.net
ごめん、ハードとソフトウェアだった

681 :デフォルトの名無しさん:2017/09/17(日) 18:10:58.66 ID:hRPbVJUN.net
ヒープの管理しないでなんとかなるレベルのものはgc言語使えばいいんでは?
このスレの趣旨的にそうでしょ?

682 :デフォルトの名無しさん:2017/09/17(日) 21:59:59.26 ID:S40DCpdn.net
自分はメモリ対策プログラムを作って対応したけどな。
メモリサイズを三種類用意して、メモリに対するガードの確実な作りにした。
現在のサイズに使われてるサイズにリミットサイズの三種類のサイズな。
外に出てくるサイズは現在のサイズ、
使われてるサイズはメモリを増やした場合の最大取得サイズで、事実上の取得サイズ、
リミットサイズは取得できるメモリの上限。
で、これらを組み合わせてスーパークラスを作って基本的に対応させてる。

683 :デフォルトの名無しさん:2017/09/17(日) 22:08:00.63 ID:S40DCpdn.net
メモリの増減には現在のサイズで対応し、このサイズが必要以上に大きくなると
使われてるサイズを拡張するようにした。リミットサイズは滅多に使わないけれども、
一応対応させた。
メモリに対する読み書きは専用関数を経由して読み書きするようにしたから、
素人が使っても安全なぐらいのプログラムになってる。

684 :デフォルトの名無しさん:2017/09/17(日) 22:27:01.93 ID:S40DCpdn.net
あと、動的配列ってのを作って、複数のメモリ取得に対応させた。
メモリにヘッダとフッタを用意して、フッタには複数配列のデータに対応させ、
ヘッダには配列数とメモリサイズを入れてる。フッタには>>682のデータを持たせた。
ある意味では拡張コンパクションみたいなモノになった。

685 :デフォルトの名無しさん:2017/09/17(日) 22:33:12.53 ID:S40DCpdn.net
で、アローケートが一回だけになるようにして、あとはリアロークで対応させた。
おかげでメモリの消費効率は異常なまでに効率よく使えるようになったよ。
あと、動的配列使う場合はいったんメモリをフォーマットするようにしたけどね。

686 :デフォルトの名無しさん:2017/09/17(日) 23:21:53.67 ID:S40DCpdn.net
それから、動的配列は入れ子構造にすれば色々と応用がきくようになってるけどな。
で、追記式みたいにデータが動くツリー構造とかが使えるようになってる。

687 :デフォルトの名無しさん:2017/09/17(日) 23:27:13.12 ID:2kxiy1Rb.net
アセンブラできない馬鹿がC++使うことを想定するとGCは成功と言わざるをえない。

688 :デフォルトの名無しさん:2017/09/18(月) 05:14:41.46 ID:4HKrfROv.net
ID:S40DCpdn は壊れたプログラマ

689 :デフォルトの名無しさん:2017/09/19(火) 04:18:18.94 ID:GmtdcLyZ.net
メモリを動かして処理すれば出来る事なのにな
出来る事を出来ないというのは間違い

690 :デフォルトの名無しさん:2017/09/19(火) 09:15:50.12 ID:sOczhhK4.net
誰へのレスかすらわからないというね
誰も何も「出来ない」という趣旨のレスはしてないと思うが
独り言かね

691 :デフォルトの名無しさん:2017/09/19(火) 12:34:55.99 ID:kI9ocUjD.net
前日に連続して意味不明な独り言してるやつがいるからそれの続きだろ

692 :デフォルトの名無しさん:2017/09/19(火) 17:17:32.47 ID:xxOzXrDl.net
ワッチョイ推奨

693 :デフォルトの名無しさん:2017/09/23(土) 13:33:17.07 ID:J7EIO5I9.net
malloc()関数の内部はOSからメモリをまとめて取ってくる処理と、
すでに取ってきたメモリを(free()で空きが生じたとき)やりくりする処理の2本立て

前者の処理(システムコールの呼び出し)は比較的高コストなのでmalloc()の度に呼びはしない
また後者の処理は、連続したアドレス範囲のメモリを確保できている前提で動く

ページングはもっと下のレイヤーで行われるので、
malloc()のコード自体がMMUの有無やOSの違いを関知したりはしない

694 :デフォルトの名無しさん:2017/09/23(土) 13:35:30.80 ID:J7EIO5I9.net
例外的な変態実装は知らんが、まあ普通は

695 :デフォルトの名無しさん:2017/09/23(土) 14:27:08.01 ID:Dvp9BlYO.net
最近はjavascriptのレイヤーとかまで出来てさらに複雑面倒に

696 :デフォルトの名無しさん:2017/10/26(木) 07:49:10.45 ID:7YV3WIz9.net
かなり無駄な処理してそうだ

697 :デフォルトの名無しさん:2018/03/11(日) 23:00:34.15 ID:gpjOI+baf
スタック構造、服を着たり脱いだりすることに例えられますね。

698 :デフォルトの名無しさん:2018/05/23(水) 21:27:23.53 ID:Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

3682F

699 :デフォルトの名無しさん:2018/07/05(木) 00:30:07.61 ID:RfoszcD2.net
IZ6

700 :デフォルトの名無しさん:2018/08/31(金) 07:07:54.70 ID:EIZBTnQd.net
保守

701 :デフォルトの名無しさん:2018/08/31(金) 23:14:14.49 ID:qeyIwfZb.net
結論:GCは失敗

702 :デフォルトの名無しさん:2018/10/30(火) 23:04:20.19 ID:POwfr3jz.net
GCをルンバで例えたらどうだろう

自動

しかしテーブルの上や
冷蔵庫の中は片付けない

日常生活にさしさわりなく動いてほしい

703 :デフォルトの名無しさん:2018/10/30(火) 23:46:35.14 ID:j0ABINKp.net
それに加えてルンバが動けるように床は片付けておかないといけないとか
自動で上手く機能させるために気にしないといけない事が色々ある

205 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★