これに対する解決策がどこにも見つかりませんでした。このテーマについてもっと啓発されることを願っています。
arduino プロジェクトに動的配列の並べ替えを使用したいと考えていました。ここでarduinoプラットフォームでベクトルを使用するためのライブラリに出会いました。hereを見つけた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) が必要でした。32* + change を割り当てるこのパターンはsizeof(type)
、他のデータ型 (char、float など) にも存在するようです。sizeof(int) = 2
arduinoで注意してください。
私の問題は、これらのベクトルに入力したいオブジェクトが 10 ~ 20 バイトの大きさであることです。ATMega328 で使用できる RAM は 2 kB しかないため、現在設計されているプログラムを実行することはできません。を持つオブジェクトの場合segment
、sizeof(segment) = 16
ベクトルは 522 バイトの RAM ブロックを消費します。
だから私の質問は:
ベクトルのサイズが 7 バイトしかないのに、そのタイプにもかかわらず、ベクトルが 32 * sizeof(type) バイトの RAM を割り当てるのはなぜですか?
arduino プラットフォームで一種の動的配列を使用するより良い方法はありますか?
ベクトルを使用できるメモリ管理手法はありますか?
この質問が重複している場合は、事前に申し訳ありません。
編集:
ベクターは容量32で初期化されているようです。
intVector.capacity() = 32;
どちらかを使おうとする
intVector.reserve(1); // or
intVector.resize(1);
ベクトルの容量は変更されません。