在编写有限CPU和内存资源的嵌入式系统的C++代码时,通常的经验法则是在堆栈中实例化对象,并避免使用堆,除非真正必要。这样做当然有许多已知的好处,但随着STL的出现和人们推荐std::vectors作为一种高效的数据结构,它是否违反了我提到的经验法则,因为vector将使用堆?
例如:过去,我们会声明具有满足使用要求的已知大小的静态数组。现在,我们只需使用向量。
我对这种转变并不感到舒适,因为向量有可能无法分配所需的内存(提醒:这是针对内存有限的嵌入式系统的)。使用已知大小的堆栈数组可以保证在编译时有空间进行分配。
调用reserve()有些帮助,但这是在运行时完成的。
那么,这是一个值得关注的问题,还是我只是过于谨慎?对于嵌入式环境来说,使用这些向量肯定更容易,但可能不是一个好主意?
注意:这不是关于动态与固定数组的问题,而更多的是关于如何在内存中分配数据的问题,这对我的环境来说非常重要。例如,有些人会这样做:假设数组的大小在1到10个元素之间变化。有些人会在堆栈中创建一个覆盖这个大小的数组,并根据当前大小进行空置终止。这样可以避免碎片,而且我们可以保证在编译时进行分配。然而,转换为vector使代码更清晰了,但代价是使用堆,并有可能在分配失败时处理异常。这就是我担心的地方。
例如:过去,我们会声明具有满足使用要求的已知大小的静态数组。现在,我们只需使用向量。
我对这种转变并不感到舒适,因为向量有可能无法分配所需的内存(提醒:这是针对内存有限的嵌入式系统的)。使用已知大小的堆栈数组可以保证在编译时有空间进行分配。
调用reserve()有些帮助,但这是在运行时完成的。
那么,这是一个值得关注的问题,还是我只是过于谨慎?对于嵌入式环境来说,使用这些向量肯定更容易,但可能不是一个好主意?
注意:这不是关于动态与固定数组的问题,而更多的是关于如何在内存中分配数据的问题,这对我的环境来说非常重要。例如,有些人会这样做:假设数组的大小在1到10个元素之间变化。有些人会在堆栈中创建一个覆盖这个大小的数组,并根据当前大小进行空置终止。这样可以避免碎片,而且我们可以保证在编译时进行分配。然而,转换为vector使代码更清晰了,但代价是使用堆,并有可能在分配失败时处理异常。这就是我担心的地方。