【发布时间】:2014-01-17 10:46:59
【问题描述】:
在为 CPU 和内存资源有限的嵌入式系统编写 C++ 代码时,常见的经验法则是在堆栈中实例化对象,除非确实需要,否则避免使用堆。这样做当然有很多已知的好处,但是随着 STL 的出现和人们推荐 std::vectors 作为一种有效的数据结构,它是否违反了我提到的经验法则,因为向量将使用堆?
示例:在过去,人们会声明具有已知大小的静态数组以满足使用需求。如今,人们只会使用向量。
我对这种转换不太满意,因为向量总是有可能无法分配所需的内存(提醒:这是针对内存有限的嵌入式系统)。在堆栈中使用已知大小的数组可以保证在编译时有空间分配。
调用 reserve() 有点帮助,但这是在运行时完成的。
那么,这是引起关注的原因,还是我只是偏执?使用这些向量肯定容易得多,但对于嵌入式环境,这可能不是一个好主意?
注意:这不是关于动态数组还是固定数组,而是更多关于如何在内存中分配数据,这对我的环境来说很重要。例如,有些人会这样做:假设数组可以在 1 到 10 个元素之间增长或缩小。有些人会在堆栈中创建一个覆盖此大小的数组,并且 NULL 根据当前大小终止。这样,可以避免碎片,并保证在编译期间进行分配。然而,切换到向量使它更干净,但代价是使用堆,并且如果分配失败,可能不得不处理异常。这就是我所关心的。
【问题讨论】:
-
如果您知道向量中有多少项目(或至少是粗略估计),那么您可以
reserve为数据留出空间。 -
如果在编译时知道大小并且确保堆栈足够大,那么静态或自动数组没有任何问题。当您特别需要动态数组时,请使用
vector。 (现在,如果您愿意,可以使用std::array使固定大小的数组看起来更像 STL。) -
堆可以炸,就像堆可以满。
-
“有限的 CPU 和内存资源”在今天的含义与创建类似的经验法则时有所不同。这取决于您的硬件到底有多有限。如果您的内存以数十或数百字节为单位,CPU 速度以 kHz 为单位,那么这些规则仍然有效,但如果您有兆字节的 RAM 和千兆赫的周期,那么您通常可以避免担心优化。
-
克里斯托弗·约翰逊,我不敢苟同。我正在开发的硬件有 32MB 内存,并且遵循经验法则使我们能够维护这个规范,而无需创建新硬件。随着新程序员的加入,每个功能的内存使用量突然激增。
标签: c++ c++11 vector stl embedded