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,我将无法按照目前的设计运行我的程序.对于一个对象segment与sizeof(segment) = 16,载体吃掉的RAM 522字节块.
所以我的问题是:
当向量的大小只有7个字节时,为什么向量会分配32*sizeof(类型)字节的RAM,尽管它的类型?
有没有更好的方法在arduino平台上使用某种动态数组?
是否有可以让我使用向量的内存管理技术?
谢谢,如果这个问题重复,请提前抱歉!
编辑:
似乎向量初始化为容量为32.
intVector.capacity() = 32;
Run Code Online (Sandbox Code Playgroud)
试图使用其中之一
intVector.reserve(1); // or
intVector.resize(1);
Run Code Online (Sandbox Code Playgroud)
不会改变矢量的容量.
为了提高效率,向量会一次分配更多的空间 - 每次尝试插入单个项目时,都不希望它重新分配.即使它仍然是空的,它很可能初始化为32个项目的容量.
尝试打印出来vec.capacity(),找出它预留空间的元素数量.
向量是标准容器中空间效率最高的,它应该只使用每个元素所需的量加上一些不变的开销.