![](/img/trans.png)
[英]Is there an STL algo that takes predicate for summing up the elements of a vector in C++
[英]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塊。
所以我的問題是:
為什么向量的大小僅為7個字節,而不論其類型如何,為什么向量都會分配32 * sizeof(type)字節的RAM?
有沒有更好的方法在arduino平台上使用某種動態數組?
是否有內存管理技術可以讓我使用向量?
謝謝,如果此問題重復,請提前抱歉!
編輯:
似乎向量已初始化為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
但這可能會破壞代碼,如果有任何事情取決於總是分配此空間的話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.