フラグメンテーションって気にした方がいいんですか

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ウーパールーパー山田
記事: 19
登録日時: 5年前

フラグメンテーションって気にした方がいいんですか

#1

投稿記事 by ウーパールーパー山田 » 5年前

こんばんわ ネットを調べても中々、お目当ての情報が得られないので質問させてください

ヒープ領域の確保と解放を繰り返すと、小さい空きメモリがたくさんできるフラグメンテーションという状態になるそうですが
これはプログラムを書く方からしたらどういった対応をするべきなのでしょうか
あるサイトではヒープ領域の確保はなるべく纏めてやったほうが小さい空きメモリができにくいと記述されており、
またあるサイトでは纏めてメモリを確保しよう(配列)とするとフラグメンテーションにより確保できない場合があるけど
リスト構造にすればそんなことは起きづらいよと記述されていました

実際、プログラムを書く方からしたらどちらの言い分を信じれば(実行すれば)いいのですか?
また、フラグメンテーションはそんなに気にした方がいい問題でしょうか?
(自分的には天下のwindows様ならデフラグのようなことぐらい裏でやってくれてると信じてます)

御回答よろしくお願いします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: フラグメンテーションって気にした方がいいんですか

#2

投稿記事 by softya(ソフト屋) » 5年前

ウーパールーパー山田 さんが書きました:あるサイトではヒープ領域の確保はなるべく纏めてやったほうが小さい空きメモリができにくいと記述されており、
またあるサイトでは纏めてメモリを確保しよう(配列)とするとフラグメンテーションにより確保できない場合があるけど
リスト構造にすればそんなことは起きづらいよと記述されていました
前後の文脈がわからないですが、纏めの意味が違う気がします。
前者の纏めは、小さい領域を幾つも確保するときはタイミングをまとめたほうが良い意味で、後者の場合は配列(1つの領域)でアロックするという意味の領域の纏めです。
それとフラグメント化の問題に関しては前者は発生を出来るだけ防ぐ方法書いてますが、後者は発生した後の対象方法を書いています。
つまり、話の趣旨が全く違うのです。

>また、フラグメンテーションはそんなに気にした方がいい問題でしょうか?

小さな領域を大量に確保・解放を繰り返すなら気にしたほうが良いでしょう。
それ以外はさほど問題にはなりませんが、こればかりは経験で分かってきますとしか言えませんね。

>(自分的には天下のwindows様ならデフラグのようなことぐらい裏でやってくれてると信じてます)

それは無理ですね。そこまでメモリ・デフラグで速度を犠牲にすることは出来ません。
ページ単位(4096Byte)なら仮想記憶の働きで常にデフラグされているようなものですけどね。
それより小さいな領域は如何ともし難いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ウーパールーパー山田
記事: 19
登録日時: 5年前

Re: フラグメンテーションって気にした方がいいんですか

#3

投稿記事 by ウーパールーパー山田 » 5年前

ご返信ありがとうございます!

フラグメンテーションが起きた時の対処方法ということはメモリが確保できなかったときにも臨機応変に対処するための
仕組みを作っておくということですか・・・
私なら面倒なので強制終了させちゃいますけど

実は現在、フォルダ内のファイル名をchar型配列に格納していくプログラムを作成中なのですが
はじめにフォルダ内のファイル数を数えてファイル数の分だけchar型配列を確保して、
ファイル名をchar型配列に格納するためにまた最初からファイルを操作するという作業が
二度手間のように感じたので質問させていただきました(身の上話)

ちょっと面倒ですが上記の方法でいこうと決心できました ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る