'ArrayA'という名前の配列があり、intでいっぱいですが、条件が満たされるたびに、配列の最後にさらに5つのセルを追加したいと思います。どうすればいいですか?(インターネットはあまり役に立ちません)
3 に答える
これが静的配列の場合は、より多くのスペースを持つ新しい配列を作成し、データを自分でコピーする必要があります。質問のタイトルが示すように、malloc() で割り当てられた場合は、realloc() を使用して多かれ少なかれ自動的にこれを行うことができます。一般に、アレイのアドレスは変更されていることに注意してください。
C++ のような言語がベクトルを導入したのは、まさに必要に応じて拡大 (および縮小) する「動的」配列が必要なためです。彼らは隠れて管理を行います。
realloc関数が必要です。
また、5 つのセルを追加することは、最適なパフォーマンス ソリューションではないことに注意してください。配列の増加が必要になるたびに、配列のサイズを 2 倍にすることをお勧めします。2 つの変数を使用します。1 つはサイズ(使用される整数の数) 用で、もう 1 つは容量(配列の実際のメモリ サイズ) 用です。
最新の OS では、使用しない大量のメモリを割り当てると、実際には物理 RAM を消費せず、仮想マッピングとしてのみ存在すると想定するのが一般的に安全です。OS は、ページ (現在は通常 4Kb のチャンク) が初めて使用されるとすぐに物理 RAM を提供します。
mmap
を使用して大規模な匿名マッピング ( ) を作成することにより、この動作を具体的に強制することができますMAP_PRIVATE | MAP_ANONYMOUS
。たとえば、最大で保持する予定です。最新の x64 システムでは、仮想マッピングは最大 64Tb まで大きくなる可能性があります。これはプログラムで論理的に使用できるメモリですが、実際にはページを使用し始めるとページが追加されます。
realloc
他のポスターで説明されているように、malloc
マッピングのサイズを変更するのは単純な方法ですが、再割り当てが成功したことを確認してください。失敗する可能性があります!
メモリを一度使用すると、メモリの問題が発生し、割り当てを解除して使用を停止しないでください。対照的に、割り当てられているが変更されていないメモリは、通常、VM テーブル エントリ以外のリソースを実際には使用しません。