GCは失敗。メモリは自分で管理せよ! その2©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/
639デフォルトの名無しさん
垢版 |
2017/05/26(金) 12:05:46.50ID:uY9cFHyF
>>638
FrameGCはゲームというかRTSに特化したGCだね

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

ざっくりこんな感じ?
2017/05/26(金) 20:16:13.14ID:0194UVlm
内部的にC#をC++に変換してるからC#をスクリプト的に使ってるだけで実質C++だな。当然GC・メモリアロケータ周りも身内実装。
2017/05/26(金) 22:20:13.64ID:uY9cFHyF
>>640
C++のスマートポインタみたいな形で実装できるのかな?
俺は検討してみたけど無理だったw
2017/06/03(土) 06:38:16.81ID:MyiMvGI/
そこまでやって既存のフレームワーク使えるのって疑問が。
2017/06/03(土) 10:06:08.23ID:sCohk93m
GCがconflictするんですね判ります
644デフォルトの名無しさん
垢版 |
2017/09/11(月) 12:41:54.43ID:YXmvV/7e
「メモリ」+「フラグメンテーション」で検索すると色々と詳しい話が出てくるね。
645デフォルトの名無しさん
垢版 |
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
2017/09/11(月) 13:44:59.20ID:I3u+9T/v
メモリのフラグメンテーションなど実質的には気にする必要は全くない
なぜなら現実のコンピュータにはMMUが付いてるから
物理メモリの連続空間が枯渇することは考えなくてもよい
あり得るとしたら32bitプロセスでの論理アドレスの連続空間の枯渇であるが
64bitプロセスにすれば問題ない
もともと論理アドレス空間が枯渇するかもしれないほどメモリを使うのなら
64bitプロセスにするのが当たり前なので・・・
というわけでメモリのフラグメンテーションは気にしなくてよい
CPUのキャッシュのヒット率を上げるとか、そういうことでなければ
2017/09/11(月) 17:53:09.29ID:P5pczjP2
そうなん?
ガベコレの回収効率が悪くなって
無駄な使用領域が増えて枯渇しやすくなるんじゃね
2017/09/11(月) 18:13:16.59ID:SGfZs9nE
>>647
GCのアロケートサイズとページングサイズの区別もついてないアホはスルーでよろしく
2017/09/11(月) 20:33:05.66ID:I3u+9T/v
程度の問題であって
世のプログラムがフラグメンテーションなど気にせずとも
普通に動いているのを見てわかる通り、問題になってない
MMUがあるから
2017/09/11(月) 21:54:05.93ID:khvQxUtn
>>646
そういうぬるい環境で済むところもあればそうじゃないところもある
ゲームコンソールだと物理メモリサイズに最適化するからな
STLとかdefault allocatorで気軽に使ってヒープ汚しまくってると
そのうち物理メモリ足りなくなってページアウト
2017/09/12(火) 10:09:32.99ID:g0xsLkF6
必ず来ると思った、その反論
しかし、稀な事例を持ち出して、どうこう言っても仕方がない
2017/09/12(火) 12:38:17.20ID:E3lbzyXM
MMU のお陰でふらぐめんてーしょんが起きない環境の方が希だと思うが
2017/09/12(火) 13:22:19.16ID:crCgFvVY
フラグメンテーションはアドレス空間や実メモリ量が限定される環境をどううまく使うかの話だから
MMUがあって64bit空間なら平気と言われてもな
654デフォルトの名無しさん
垢版 |
2017/09/13(水) 03:53:58.25ID:TAF2DPKT
そそ、複雑なプログラムって書こうと思えばいくらでも複雑化するからな。
で、簡潔で高度と思われる機能を追加していくほど難易度は指数関数的に増大するし。
655デフォルトの名無しさん
垢版 |
2017/09/13(水) 05:10:44.22ID:t818hmCa
でも実際スマホアプリ作ってんのにフラグメンテーションを防ぐ為に最初に使用する分全部確保しておいて、その中で割り当てするんだーとかいって、オレオレアロケーター作ろうとする頭の悪いやつがいて困る。
逆にお前の作ったそのアロケーターの中でフラグメンテーションして枯渇するわと。
2017/09/13(水) 07:42:12.50ID:7O+lQKpp
組み込みなんかでよくあるそういうのは、どっちかというと最初に確保したメモリ以上を
使用しないことを保証するためにやるもんだろう。
2017/09/13(水) 08:52:01.48ID:Vaq5SeW/
アロケータ置き換えるだけでは普通解決しないでしょ
>>655 こそが置き換えて何するのか理解できてない気がする
2017/09/13(水) 22:09:52.04ID:PcFMQESF
むしろ一定時間を保証する(なのでサイズは固定長とかが多い)もんだろ
659デフォルトの名無しさん
垢版 |
2017/09/17(日) 13:06:26.21ID:S40DCpdn
いくら64bitあっても設計が雑ならメモリ枯渇するでしょ
ページング方式でメモリ消費されてんだし
2017/09/17(日) 13:32:06.14ID:2kxiy1Rb
MMUのアドレス変換コストもタダじゃない。
TLBキャッシュ外れたら遅くなる。
661デフォルトの名無しさん
垢版 |
2017/09/17(日) 13:32:07.34ID:S40DCpdn
1回のメモリ取得で4kづつ消費されるわけか
662デフォルトの名無しさん
垢版 |
2017/09/17(日) 13:49:19.58ID:S40DCpdn
ツリー状のメモリ管理するとあっという間にメモリ無くなるな
class CTree{
std::vector<CTree>;
};
とか
663デフォルトの名無しさん
垢版 |
2017/09/17(日) 14:00:55.72ID:S40DCpdn
こうするとさらにメモリが消えていくな
class CTree{
std::map<std::string,CTree>;
};
664デフォルトの名無しさん
垢版 |
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づつメモリを消費するわけで・・・
2017/09/17(日) 15:23:52.56ID:iyMogwhx
一回のメモリ取得で4KBってのが嘘だから意味が無い話だね
MMUついてたって、そんなアホな実装は無い

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

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

ウィキペディア見るとそのアフォな実装がまかり通ってると読めるんだが・・・
2017/09/17(日) 15:48:55.35ID:iyMogwhx
アホだなぁ
OSレベルのメモリ確保と言語レベルのnew、mallocは別
668デフォルトの名無しさん
垢版 |
2017/09/17(日) 16:00:06.71ID:S40DCpdn
こっちも参考になる
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.06ID:S40DCpdn
>>667
ちゃんとmallocやnew時のアドレス確認はしたか??かなりアフォな動作してるぞ?
まあ、多少のrealloc程度の処理なら何とかしてくれるけどな。
2017/09/17(日) 16:13:26.66ID:iyMogwhx
mallocやnewは
大きなサイズを確保するときと
小さなサイズを確保するときで
アルゴリズムが切り替わる
2017/09/17(日) 16:17:08.43ID:iyMogwhx
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.54ID:S40DCpdn
MMUは多少以上の処理をすると簡単にフォールト返すのが困りもの
結局初心者レベルのプログラマしか想定してないんだよな
673デフォルトの名無しさん
垢版 |
2017/09/17(日) 16:30:36.71ID:S40DCpdn
>>671
realloc使った事ある?
2017/09/17(日) 16:34:30.81ID:iyMogwhx
お前が残念なことと何の関係が?
あほらし
675デフォルトの名無しさん
垢版 |
2017/09/17(日) 16:37:39.46ID:S40DCpdn
複雑なことをしていると、それがまるで正しいかのように思う点がアフォ
多少複雑なことをしていてもアフォな挙動をする可能性はあると考えるべき
676デフォルトの名無しさん
垢版 |
2017/09/17(日) 17:05:23.31ID:S40DCpdn
malloc,newの挙動の説明ってまんまMMUの説明なんだよな
だから複雑なアルゴリズムを使われていると思うのはMMUが複雑な挙動をしているから
でも、そんなに複雑な挙動してるか??
単に過去のアプリとの互換性の問題で変な事をしているだけだぞ
677デフォルトの名無しさん
垢版 |
2017/09/17(日) 17:16:19.17ID:S40DCpdn
たいがいのmalloc,newはMMU次第でいくらでも挙動が変化するからな
ちゃんとPC毎に動作確認したか??
2017/09/17(日) 17:44:23.50ID:4FsrO7aF
ID:S40DCpdn しったかしすぎ
mallocの挙動はヒープのアルゴリズム次第
679デフォルトの名無しさん
垢版 |
2017/09/17(日) 17:55:14.06ID:S40DCpdn
malloc,newの挙動はハードとOSによって変化するという記述は見たことあるけどな
680デフォルトの名無しさん
垢版 |
2017/09/17(日) 18:02:58.95ID:S40DCpdn
ごめん、ハードとソフトウェアだった
2017/09/17(日) 18:10:58.66ID:hRPbVJUN
ヒープの管理しないでなんとかなるレベルのものはgc言語使えばいいんでは?
このスレの趣旨的にそうでしょ?
682デフォルトの名無しさん
垢版 |
2017/09/17(日) 21:59:59.26ID:S40DCpdn
自分はメモリ対策プログラムを作って対応したけどな。
メモリサイズを三種類用意して、メモリに対するガードの確実な作りにした。
現在のサイズに使われてるサイズにリミットサイズの三種類のサイズな。
外に出てくるサイズは現在のサイズ、
使われてるサイズはメモリを増やした場合の最大取得サイズで、事実上の取得サイズ、
リミットサイズは取得できるメモリの上限。
で、これらを組み合わせてスーパークラスを作って基本的に対応させてる。
683デフォルトの名無しさん
垢版 |
2017/09/17(日) 22:08:00.63ID:S40DCpdn
メモリの増減には現在のサイズで対応し、このサイズが必要以上に大きくなると
使われてるサイズを拡張するようにした。リミットサイズは滅多に使わないけれども、
一応対応させた。
メモリに対する読み書きは専用関数を経由して読み書きするようにしたから、
素人が使っても安全なぐらいのプログラムになってる。
684デフォルトの名無しさん
垢版 |
2017/09/17(日) 22:27:01.93ID:S40DCpdn
あと、動的配列ってのを作って、複数のメモリ取得に対応させた。
メモリにヘッダとフッタを用意して、フッタには複数配列のデータに対応させ、
ヘッダには配列数とメモリサイズを入れてる。フッタには>>682のデータを持たせた。
ある意味では拡張コンパクションみたいなモノになった。
685デフォルトの名無しさん
垢版 |
2017/09/17(日) 22:33:12.53ID:S40DCpdn
で、アローケートが一回だけになるようにして、あとはリアロークで対応させた。
おかげでメモリの消費効率は異常なまでに効率よく使えるようになったよ。
あと、動的配列使う場合はいったんメモリをフォーマットするようにしたけどね。
686デフォルトの名無しさん
垢版 |
2017/09/17(日) 23:21:53.67ID:S40DCpdn
それから、動的配列は入れ子構造にすれば色々と応用がきくようになってるけどな。
で、追記式みたいにデータが動くツリー構造とかが使えるようになってる。
2017/09/17(日) 23:27:13.12ID:2kxiy1Rb
アセンブラできない馬鹿がC++使うことを想定するとGCは成功と言わざるをえない。
2017/09/18(月) 05:14:41.46ID:4HKrfROv
ID:S40DCpdn は壊れたプログラマ
689デフォルトの名無しさん
垢版 |
2017/09/19(火) 04:18:18.94ID:GmtdcLyZ
メモリを動かして処理すれば出来る事なのにな
出来る事を出来ないというのは間違い
2017/09/19(火) 09:15:50.12ID:sOczhhK4
誰へのレスかすらわからないというね
誰も何も「出来ない」という趣旨のレスはしてないと思うが
独り言かね
691デフォルトの名無しさん
垢版 |
2017/09/19(火) 12:34:55.99ID:kI9ocUjD
前日に連続して意味不明な独り言してるやつがいるからそれの続きだろ
2017/09/19(火) 17:17:32.47ID:xxOzXrDl
ワッチョイ推奨
2017/09/23(土) 13:33:17.07ID:J7EIO5I9
malloc()関数の内部はOSからメモリをまとめて取ってくる処理と、
すでに取ってきたメモリを(free()で空きが生じたとき)やりくりする処理の2本立て

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

ページングはもっと下のレイヤーで行われるので、
malloc()のコード自体がMMUの有無やOSの違いを関知したりはしない
2017/09/23(土) 13:35:30.80ID:J7EIO5I9
例外的な変態実装は知らんが、まあ普通は
2017/09/23(土) 14:27:08.01ID:Dvp9BlYO
最近はjavascriptのレイヤーとかまで出来てさらに複雑面倒に
2017/10/26(木) 07:49:10.45ID:7YV3WIz9
かなり無駄な処理してそうだ
697デフォルトの名無しさん
垢版 |
2018/05/23(水) 21:27:23.53ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

3682F
698デフォルトの名無しさん
垢版 |
2018/07/05(木) 00:30:07.61ID:RfoszcD2
IZ6
2018/08/31(金) 07:07:54.70ID:EIZBTnQd
保守
2018/08/31(金) 23:14:14.49ID:qeyIwfZb
結論:GCは失敗
701デフォルトの名無しさん
垢版 |
2018/10/30(火) 23:04:20.19ID:POwfr3jz
GCをルンバで例えたらどうだろう

自動

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

日常生活にさしさわりなく動いてほしい
2018/10/30(火) 23:46:35.14ID:j0ABINKp
それに加えてルンバが動けるように床は片付けておかないといけないとか
自動で上手く機能させるために気にしないといけない事が色々ある
2019/07/03(水) 08:55:46.04ID:XKc3eOoC
もういらないって明示的に書かなきゃならないのなら自前で管理するのと一緒だよな。
アマチュアがサンデープログラムしたり、短時間で終了するアプリならむしろ楽チンだけど、
365日24時間稼働し続けるシステムには致命的な問題になるからなぁ
704デフォルトの名無しさん
垢版 |
2020/02/13(木) 08:56:02.27ID:B+Fb/epo
まあ落ちるアプリの多いこと
2020/02/13(木) 15:29:41.61ID:z5cRWLgY
GCがある言語でも、shallow copy と deep copy のどちらにすべきかの判断が難しくて、結局、間違えてバグの原因になる可能性がかなり残る。

また、C/C++ポインタのミスを危険視する人がいるが、多くの場合はプログラム開発時にテストをすれば間違いが発見できる。

C/C++でのバッファオーバーランを気にする人がいるが、逆にGCがある言語でも、間違って1つ右隣の要素にしてしまったり、処理する個数を1つ間違ったりするミスは有り得て、その場合、厳密な意味でのバッファオーバーランは無くても処理内容自体はバグる。
706デフォルトの名無しさん
垢版 |
2020/02/22(土) 01:52:20.63ID:eI8xgqVo
No GC派なんだけど、WebサーバーをC++とかで実装しても結局力持て余す感はあるよな
それだからかなり性能下げてもいいからちょっとでも早く作れるスクリプト言語採用されるってのもありそう
2020/02/25(火) 21:09:36.95ID:EsX3m3+2
GCのメリットは言語の文法が簡単になること。
GCはスクリプト言語のためにある。
708デフォルトの名無しさん
垢版 |
2020/02/26(水) 10:49:39.07ID:wiEfavJ1
(destructor)()
dispose()
destroy()
close()
free()
delete
2021/10/13(水) 08:41:51.52ID:Qk99MJFD
今やGCのない言語でweb framework書く人間は絶滅危惧種
2022/12/27(火) 13:22:02.97ID:k0608tOt
このスレってガイジ扱いされてたけどRustとか出てきて実は正論だったんじゃね?って見直してるわ
711デフォルトの名無しさん
垢版 |
2022/12/27(火) 15:08:00.70ID:ITKU+yxr
てへっ(∀`*ゞ)テヘッ
712デフォルトの名無しさん
垢版 |
2022/12/28(水) 20:55:42.01ID:kKtGrfmE
おれはGCが最初から分かりづらいなぁと思ってたよ。mallocやnewより
713デフォルトの名無しさん
垢版 |
2022/12/29(木) 10:46:26.29ID:jCj0trE4
>>708
release
2022/12/29(木) 16:52:23.68ID:HWC94+Gl
GCは停止時間問題を解決できないまま生涯ふわふわした存在で居続けるのだよ
715デフォルトの名無しさん
垢版 |
2023/01/01(日) 09:16:28.52ID:A1pcbmVG
>>1は、2014年に問題提起してるのか・・・。

Rustとかは2010年ころ発表だけど、実際に一般に知られるようになったのって2021年頭から
>>1は、それなりに的を射た技術理解・評価をしてるんだな

俺は人気の言語を覚えて、周りが言ってるメリットを、反対派にコピペするだけだけどww

ま、Pythonのお手軽さを超えることはないと思うけど、どこまでRustは伸びるのかなぁ
2023/02/08(水) 15:30:25.91ID:MLBtrq1u
やはりGCは必要だった

WebAssemblyにガベージコレクション機能が登場、Chrome 111で試験的実装に。Dartなど高級言語のWebAssembly対応へ前進
https://www.publickey1.jp/blog/23/webassemblychrome_111dartwebassembly.html
2023/02/10(金) 09:06:41.51ID:fIr5pCup
すべてがBASICに戻る
718デフォルトの名無しさん
垢版 |
2023/02/11(土) 11:51:58.99ID:2GIAa1ZP
>>717
それもいいな
2023/03/08(水) 00:10:24.00ID:ZNO423TE
GCを含め、「機械に不慣れな人でも簡単にプログラミングできるようにする」という
これまで高級言語が行ってきたような試みはすべてAIに取って替わられるような気がする
まあ、現時点のAIは使い物にならないかもしれないが、いずれは…
2023/03/10(金) 23:04:44.35ID:hNo+M64i
AIに「これはゴミか?」を学習させていって人間がゴミ認定される日も近い
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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