我正在一個項目,我需要malloc一些數據。我試圖通過改變我使用的主要結構值來減少我的程序的堆峯。我正在使用鏈接列表。我的結構是這樣的:malloc全球陣列
struct myS{
int a,b;
float a,b;
struct myS *next;
};
我在想,而不是mallocing的結構指針我將其存儲在一個全局數組,因爲我沒有太多的數據。我將如何做到這一點?
我正在一個項目,我需要malloc一些數據。我試圖通過改變我使用的主要結構值來減少我的程序的堆峯。我正在使用鏈接列表。我的結構是這樣的:malloc全球陣列
struct myS{
int a,b;
float a,b;
struct myS *next;
};
我在想,而不是mallocing的結構指針我將其存儲在一個全局數組,因爲我沒有太多的數據。我將如何做到這一點?
你可以做這樣的事情:
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 */
如果你有你可以用創建一個全局數組 [不動態分配],讓它爲struct myS heap[]
,並且整數idx
,初始化爲0
。分配元素後,您需要增加idx
,並將此元素附加到請求者。
注 - 它只是如果你不希望刪除的元素很好地解決 [或者你能負擔得起分配每個元素只有一次。
如果您確實需要刪除,您需要分配一個額外的數組,告訴您當前正在使用哪些元素,使idx
循環[與idx = (idx + 1) % size
一起增加],並在給出之前檢查每個元素是否已分配,但正如我所說 - 它可能會更耗時!
代碼卡[不支持刪除]:
struct myS heap[SIZE];
int idx = 0;
...
struct myS* allocate() {
return &(heap[idx++]);
}
注:上面的代碼卡是危險的 - 如果你嘗試分配更多的元素,那麼你必須在SIZE
它可能溢出。
如果您維護陣列中的空閒節點列表,最初由整個陣列組成,則無需執行遍歷即可找到未分配的節點。 – 2012-04-14 00:03:50
@KeithThompson:謝謝,那確實可以是一個很好的優化!但我相信OP實際上是在分配每個元素的簡單版本之後,我將編輯並嘗試添加您描述的解決方案,如果他會指出這確實是他之後的事情。 – amit 2012-04-14 00:05:57
如果你真的沒有太多的數據,不要這樣做。這聽起來像是過早的優化。如果你有很多數據,不要這樣做,但首先閱讀'malloc'的替代品和類似的東西。 – 2012-04-14 06:59:06