0

既存の構造体 (最初にメモリが割り当てられている) に対して、実行時に (C で) 追加のメモリを割り当てる方法を探しています。私はmemmoveなどを使用できるかもしれないと感じていますが、それはまだ単なるコピー操作であり、実行時に構造体が使用できるメモリの量は増えません。また、これを行う必要があるたびに構造全体をコピーする必要はありません。これは、プログラム中に何百回も行われます (構造はすでに巨大です)。誰でも助けることができますか?

更新: 返信ありがとうございます。詳細を説明するために、私がやろうとしているのは、最初に構造体の多くのインスタンス (「S」と呼びます) を作成する MPI 並列化コードを実行することです。構造体の各インスタンスには、コードの実行時に発生した特定のイベントの時間を記録する配列 'T' が含まれています。これらのイベントは実行時に発生し、イベントの数は S のインスタンスごとに異なります。たとえば、S[0] には 100 個のイベントが表示される場合があります (したがって、長さが 100 要素の配列が必要です) が、S[1] には 1 つのみが表示される場合があります。イベント (および S[2] 30 イベントなど) したがって、S のすべてのインスタンス (何百万もある) の開始時に膨大な量のメモリを割り当てるのは非常に無駄です。近づいても。

ここでいくつかのアイデアを試して、進捗状況を投稿します。どうもありがとう!

4

4 に答える 4

5

おそらく使用できますrealloc()

于 2013-01-22T08:56:41.130 に答える
3

構造が現在占有しているメモリの隣に使用可能なメモリがあることを保証する方法がないため、説明したことを実行する方法はありません。

標準的な方法は、より多くのメモリを割り当ててデータをコピーすることです。もちろん、必要なメモリ割り当てのサイズ(の見積もり)がわかっている場合は、事前に割り当ててコピーを回避できます。

ただし、Cの構造体は、宣言されるとサイズが固定されるため、既存の構造体にさらにメモリを割り当てる必要はないようです...

于 2013-01-22T08:56:33.050 に答える
0

realloc既存の動的メモリを拡張する唯一の方法です。realloc既存のバッファを拡張しようとします。拡張に失敗した場合は、必要な合計サイズの新しいバッファを割り当て、古いバッファからデータをコピーします。realloc毎回実行したくない場合(memmoveほとんどの場合、内部的には実行されます)、実際に必要なよりも多くのメモリを再割り当てすることができます。

realloc(buf_ptr, (actual_size + additional_size) * 2);

reallocこの方法により、 (および)を呼び出す頻度が減りmemmoveます。

注 :realloc一部のアーキテクチャでは実装が異なります。メモリを拡張しようとすることはありません。常に合計サイズのバッファを割り当てようとします。したがって、これらのプラットフォームmemmoveでは、 への呼び出しごとに が呼び出されreallocます。

于 2013-01-22T09:55:12.473 に答える
0

It sounds like you are looking for the C feature called flexible array member (example). It is only well-defined for C standard C99 or later.

The last member of the struct will have to be declared as a flexible array member, which you initially malloc, and later realloc (and of course memcpy to do the actual copying).

于 2013-01-22T09:56:54.393 に答える