std :: vectors应该广泛用于嵌入式系统吗?

Ryu*_*yuu 12 c++ embedded stl vector c++11

为具有有限CPU和内存资源的嵌入式系统编写C++代码时,常见的经验法则是实例化堆栈中的对象,并避免使用堆,除非确实有必要.这样做当然有许多已知的好处,但随着STL的出现和人们推荐std :: vectors作为一种有效的数据结构,它是否违反了我提到的经验法则,因为向量将使用堆?

示例:在过去,人们会声明具有已满足用量的已知大小的静态数组.如今,人们只会使用矢量.

我对这种转换并不是很满意,因为向量总是有可能无法分配所需的内存(提醒:这适用于内存有限的嵌入式系统).在堆栈中使用已知大小的数组可确保在编译期间有分配空间.

调用reserve()有点帮助,但这是在运行时完成的.

那么,这是引起关注的原因,还是我只是偏执狂?使用这些向量肯定要容易得多,但对于嵌入式环境,它可能不是一个好主意?

注意:这不是关于动态与固定数组的关系,而是关于如何在内存中分配数据的更多信息,这对我的环境来说是一个大问题.举个例子,有些人会这样做:假设数组可以在1到10个元素之间增长或缩小.有些人会在堆栈中创建一个覆盖此大小的数组,并根据当前大小终止NULL.这样就避免了碎片,并且在编译期间保证了分配.但是,切换到vector会使它更清晰,但代价是使用堆,并且如果分配失败可能不得不处理异常.这就是我所关注的.

Mat*_* M. 9

我相信你已经忘记了STL容器的一个非常重要的属性:allocators.

一个STL容器(无论是否为vector其他)从其分配器获取所有内存(除了可以检查的非常基本的堆栈占用空间sizeof).因此,它非常适合在嵌入式开发中提供专用分配器:

  • 将从预先保留的内存区域分配
  • 将绑定最大资源消耗以防止OOM
  • ...

随着C++ 11的出现,您甚至可以使用有状态分配器,以便单个分配器类型可以指向不同的内存池.

因此,使用std::vector,甚至std::set或std::map与预分配策略不相容; 请记住,除了std::vector其他STL容器外,通常还有一些每件物品的开销,在确定他们应该利用的存储区域时必须考虑到这一点.


Dan*_*vil 1

当使用足够的优化标志进行编译时,Astd::vector只是一个指针和两个。现在,当您提前知道向量的大小并且它永远不会改变时,size_t的内存就是浪费。size_t

我会说:

正如评论中提到的,您可以<algorithms>通过使用begin/end迭代器的指针在固定大小的数组上使用eg的大部分功能。

例如:

int array[8] = { 1,2,3,4,5,6,7,8 };
std::random_shuffle(array, array+8);
Run Code Online (Sandbox Code Playgroud)