簡體   English   中英

arduino上的C ++向量占用大量RAM占用空間

[英]C++ vector on arduino takes up massive RAM footprint

在任何地方都找不到解決方案。 希望對這個問題有更多的啟發。

我想為arduino項目使用各種各樣的動態數組。 我碰到一個庫來使用的Arduino平台上向量這里 我使用了一個功能來監視在這里找到的arduino上的可用RAM。

這是我的代碼示例:

Serial.print("Starting RAM: ");
Serial.println(freeRam());
Serial.println();

vector<int> intVector;

Serial.print("Remaining RAM after intVector declaration: ");
Serial.println(freeRam());
Serial.println();

vector<char> charVector;

Serial.print("Remaining RAM after charVector declaration: ");
Serial.println(freeRam());
Serial.println();


Serial.print("sizeof(intVector) = ");
Serial.println(sizeof(intVector));
Serial.print("sizeof(charVector) = ");
Serial.println(sizeof(charVector));

這是輸出:

Starting RAM: 1684

Remaining RAM after intVector declaration: 1618

Remaining RAM after charVector declaration: 1584

sizeof(intVector) = 7
sizeof(charVector) = 7

似乎intVector分配占用了RAM的66個字節塊。 看來矢量為此分配了32 * 2 + 2 = 66個字節的內存。 同樣,charVector分配占用34個字節(32 * 1 + 2)。 對於其他數據類型(例如char,float等),似乎存在這種分配32 * sizeof(type) +更改的模式。 請注意,arduino上的sizeof(int) = 2

我的問題是,我想填充這些向量的對象的大小在10到20個字節之間。 在ATMega328上只有2 kB的RAM時,我將無法運行當前設計的程序。 對於sizeof(segment) = 16的對象segment ,向量會占用522字節的RAM塊。

所以我的問題是:

  1. 為什么向量的大小僅為7個字節,而不論其類型如何,為什么向量都會分配32 * sizeof(type)字節的RAM?

  2. 有沒有更好的方法在arduino平台上使用某種動態數組?

  3. 是否有內存管理技術可以讓我使用向量?

謝謝,如果此問題重復,請提前抱歉!

編輯:

似乎向量已初始化為32。

intVector.capacity() = 32;

嘗試使用其中一個

intVector.reserve(1); // or
intVector.resize(1);

不會改變向量的容量。

為了提高效率,向量一次分配的空間超出了所需的空間-您不希望每次嘗試插入單個項目時都重新分配空間。 即使它仍然為空,它很有可能以32個項目的容量進行初始化。

嘗試打印出vec.capacity()來找出它保留了多少元素。

向量是標准容器中最節省空間的向量,它應僅使用每個元素所需的數量以及一些恆定的開銷。

快速瀏覽該vector實現表明,它總是保留額外的__UCLIBCXX_STL_BUFFER_SIZE__個字節的內存。 該預處理器符號在system_configuration.h定義為32

因此,默認構造vector總是要占用32個字節,加上vector本身必須跟蹤分配的內存,大小,容量等的所有開銷。

您可以嘗試將system_configuration.h的預處理器定義更改為

#define __UCLIBCXX_STL_BUFFER_SIZE__ 0

但這可能會破壞代碼,如果有任何事情取決於總是分配此空間的話。

如另一個答案中所述,std :: vector總是提前分配一些內存,以防止每次插入時重新分配。 要求系統提供更多的內存是一個昂貴的過程,您希望盡可能避免這樣做。

編寫一個自定義分配器。 分配器是std :: vector的可選模板參數,使用它可以重新定義其獲取內存的方式(例如,使它預分配較小的量,在每個插入處重新分配,等等)。 有關此的更多信息,您可以在STL上訪問 Nicolai Josuttis的網站 有一個免費的章節介紹了分配器(側面欄中的標題為“ Supplementary Chapter(PDF)”),並且還提供了示例代碼

暫無
暫無

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

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