arduino上的C++向量占用了大量的RAM足迹

Rya*_*uck 1 c++ ram memory-management vector arduino

无法在任何地方找到解决方案.希望在这个问题上变得更加开明.

我想为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));
Run Code Online (Sandbox Code Playgroud)

这是输出:

Starting RAM: 1684

Remaining RAM after intVector declaration: 1618

Remaining RAM after charVector declaration: 1584

sizeof(intVector) = 7
sizeof(charVector) = 7
Run Code Online (Sandbox Code Playgroud)

似乎intVector分配占用了RAM的66个字节块.为此,看起来向量分配32*2 + 2 = 66字节的内存.同样,charVector分配占用了34个字节(32*1 + 2).似乎这种分配32*sizeof(type)+更改的模式存在于其他数据类型(例如char,float等).请注意,sizeof(int) = 2在arduino上.

我的问题是我想填充这些向量的对象大到10-20字节.由于ATMega328上只有2 kB RAM,我将无法按照目前的设计运行我的程序.对于一个对象segmentsizeof(segment) = 16,载体吃掉的RAM 522字节块.

所以我的问题是:

  1. 当向量的大小只有7个字节时,为什么向量会分配32*sizeof(类型)字节的RAM,尽管它的类型?

  2. 有没有更好的方法在arduino平台上使用某种动态数组?

  3. 是否有可以让我使用向量的内存管理技术?

谢谢,如果这个问题重复,请提前抱歉!

编辑:

似乎向量初始化为容量为32.

intVector.capacity() = 32;
Run Code Online (Sandbox Code Playgroud)

试图使用其中之一

intVector.reserve(1); // or
intVector.resize(1);
Run Code Online (Sandbox Code Playgroud)

不会改变矢量的容量.

Mar*_*som 5

为了提高效率,向量会一次分配更多的空间 - 每次尝试插入单个项目时,都不希望它重新分配.即使它仍然是空的,它很可能初始化为32个项目的容量.

尝试打印出来vec.capacity(),找出它预留空间的元素数量.

向量是标准容器中空间效率最高的,它应该只使用每个元素所需的量加上一些不变的开销.