簡體   English   中英

嵌入式 C++:如何使用容器/數組與堆上的動態分配回收堆棧上的變量

[英]Embedded C++ : how to recycle variables on stack using container/array vs dynamic allocation on heap

如果我有一個生產者/消費者設置,其中要生產大量對象然后組裝成 UDP 數據報,然后再發送一個塊(而不是每個對象發送一個非常小的數據報),我想問關於不同策略的建議,以避免在生成/使用對象時不斷分配/解除分配對象。

該軟件將在嵌入式系統上運行,因此我對一種策略感興趣,該策略會在系統啟動時在堆棧上而不是在程序執行期間在堆上看到大量分配的對象。 我正在考慮以下內容,但歡迎提出建議/想法/批評。 我的提議合理嗎? (下面的偽代碼)。

class SmallCommonObject {
    // some sort of members here
    int member;
};

SmallCommonObject arrayOfObjects[MAX_ARRAY_SIZE];

// this is a collection of pointers to objects that are not in use
vector<SmallCommonObject*> unusedObjects;

// here we store pointers to objects that are in use
vector<SmallCommonObject*> objectsBeingUsed;

// initially store all objects in unused collection
for (int i = 0; i < MAX_ARRAY_SIZE; i++)
    unusedObjects.push_back(&arrayOfObjects[i]);

// if unusedObjects is not empty, we can use thus:
SmallCommonObject *object = &unusedObjects.back();
unusedObjects.pop_back();

object->member = SOME_VALUE;

// save into used container
objectsBeingUsed.push_back(object);

// repeat above as required

// now do something with the vector of objects that are in use

// when complete
for (int i = 0; i < objectsBeingUsed.size(); i++) {
    SmallCommonObject *object = &objectsBeingUsed.back();
    objectsBeingUsed.pop_back();
    unusedObjects.push_back(object);
}

我選擇的容器怎么樣,它們是最佳的嗎?

在運行時分配和釋放對象可能(相對)緩慢,並可能導致內存碎片 這在嵌入式系統中尤為重要。

動態分配的替代方法是分配一組對象一次並繼續重用它們(不釋放和重新分配內存)。 這種方法稱為資源池 您可以在此處找到示例。

根據其策略,有不同類型的資源池。 例如,可以在啟動時預先分配所有對象,或者可以在第一次使用時分配對象。 在 C++ 中,內存分配和釋放可以使用運算符 newdelete (C 中的 malloc 和 free)來完成。 一旦分配,對象就不會被釋放。 而是調用析構函數來執行任何對象清理。 在被重用之前,對象通過調用就地 new 操作符(又名placement new )重新初始化,該操作符在已經存在的內存塊上有效地調用對象的構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM