私はいくつかのデータをmallocする必要があるプロジェクトに取り組んでいます。使用する主要な構造体の値を変更することで、プログラムのヒープピークを削減しようとしています。リンクリストを使用しています。私の構造体は次のようなものです:
struct myS{
int a,b;
float a,b;
struct myS *next;
};
データが少ないので、構造体ポインターをマロケートする代わりに、グローバル配列に格納することを考えていました。これをどのように行いますか?
私はいくつかのデータをmallocする必要があるプロジェクトに取り組んでいます。使用する主要な構造体の値を変更することで、プログラムのヒープピークを削減しようとしています。リンクリストを使用しています。私の構造体は次のようなものです:
struct myS{
int a,b;
float a,b;
struct myS *next;
};
データが少ないので、構造体ポインターをマロケートする代わりに、グローバル配列に格納することを考えていました。これをどのように行いますか?
必要な要素の数に上限がある場合は、[動的に割り当てられない]グローバル配列を作成し、struct myS heap[]
それを とし、整数idx
を に初期化することができ0
ます。要素を割り当てたら、 を増やしidx
て、この要素をリクエスタにアタッチする必要があります。
注 -要素を削除する予定がない[または各要素を 1 回だけ割り当てる余裕がある] 場合にのみ、これは適切な解決策です。
削除が必要な場合は、現在使用されている要素を示す追加の配列を割り当て、idx
[increase with idx = (idx + 1) % size
] を循環させ、各要素が割り当てられているかどうかを確認してから指定する必要がありますが、私が言うように、おそらくそうなるでしょう。もっと時間がかかる!
コード スナップ [削除をサポートしていません]:
struct myS heap[SIZE];
int idx = 0;
...
struct myS* allocate() {
return &(heap[idx++]);
}
注: 上記のコード スナップは危険です。より多くの要素を割り当てようとすると、オーバーフローする可能性がありますSIZE
。
次のようなことができます。
struct myS myArray[ARRAY_SIZE];
/* ... */
struct myS *head = &myArray[0];
head->next = &myArray[1];
head->next->next = &myArray[2];
/* etc... */
使用される配列インデックスは連続している必要はありません。たとえば、head
インデックス3
でもhead->next
インデックスでもかまいません。21
配列内のすべてのエントリを一度に使用するようにリストを初期化したい場合は、ループで実行できます。
struct myS *node = head;
for (int i = 1; i < ARRAY_SIZE; i++)
{
node->next = &myArray[i];
node = &myArray[i];
}
node->next = NULL; /* Make sure the tail of the list doesn't have a 'next' pointer */