1

在任何地方都找不到解决方案。希望在这个问题上变得更加开明。

我想为 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)。似乎这种分配 32* sizeof(type)+ 更改的模式存在于其他数据类型(例如 char、float 等)。请注意,sizeof(int) = 2在arduino上。

我的问题是我想填充这些向量的对象大小在 10-20 字节之间。由于 ATMega328 上只有 2 kB 的 RAM,我将无法按照目前的设计运行我的程序。对于具有 的对象segmentsizeof(segment) = 16向量会占用 522 字节的 RAM 块。

所以我的问题是:

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

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

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

谢谢,如果这个问题是重复的,请提前道歉!

编辑:

似乎该向量被初始化为容量为 32。

intVector.capacity() = 32;

尝试使用

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

不会改变向量的容量。

4

3 回答 3

5

为了提高效率,向量一次分配的空间比它需要的多——你不希望它在每次尝试插入单个项目时都重新分配。即使它仍然是空的,它也很有可能以 32 个项目的容量进行初始化。

尝试打印vec.capacity()以找出它为多少元素保留了空间。

向量是标准容器中最节省空间的,它应该只使用每个元素所需的数量加上一些恒定的开销。

于 2012-12-06T17:31:13.980 回答
2

快速浏览该vector实现会发现它总是保留额外__UCLIBCXX_STL_BUFFER_SIZE__的内存字节。该预处理器符号定义32system_configuration.h.

因此,默认构造 avector总是占用 32 个字节加上vector本身必须跟踪分配的内存、大小、容量等的任何开销。

您可以尝试将预处理器定义更改system_configuration.h

#define __UCLIBCXX_STL_BUFFER_SIZE__ 0

但是如果有任何依赖于这个空间的东西总是被分配,这可能会破坏代码。

于 2012-12-06T17:50:41.827 回答
0

如另一个答案中所述, std::vector 总是提前分配一些内存,以防止每次插入时重新分配。向系统请求更多内存是一个代价高昂的过程,您应该尽可能避免。

编写自定义分配器。分配器是 std::vector 的可选模板参数,您可以使用它重新定义它如何获取内存(例如,使其预分配较小的数量,在每次插入时重新分配等)。有关这方面的更多信息,您可以在 STL 上查看 Nicolai Josuttis 的网站。有一个涵盖分配器的免费章节(侧栏中的标题“补充章节(PDF)”,还有示例代码

于 2012-12-06T18:00:20.943 回答