在中断处理程序下使用stl:list和stl :: vector类型我想避免malloc()调用.
问题:在STL列表和向量中阻止malloc()调用的最佳方法是什么?是否足以创建具有预定义大小的结构,然后避免推/弹/擦除调用?
先感谢您
听起来你想在初始化代码中预先分配内存,这样你的中断处理程序就可以避免堆分配.我假设您存储在这些容器中的元素本身不执行任何堆分配,因为这会使答案复杂化.
您可以std::vector通过调用reserve()方法来预分配内存.类似的方法push_back(),pop(),insert()和erase()操纵向量的大小(它目前包含元素的个数).当新尺寸大于当前容量时,它们仅影响容量(它有空间的元件数量).reserve(x)确保容量大于或等于x,必要时增加容量.(另请注意,唯一减少矢量容量的操作是swap(),因此您不必担心erase()减少矢量的容量.)
这种方法不起作用std::list,但还有另一种方法:通过将列表元素插入"备用"列表来预分配列表元素.不使用插入新元素,而是使用该splice()方法将它们从"备用"列表移动到"主要"列表.而不是擦除元素,使用该splice()方法将它们从"主"列表移动到"备用"列表.
作为证明:我们在我的工作场所使用其他答案中提到的两种方法:
大多数情况下,我们做这两件事是为了避免碎片、减少分配器开销、消除增长时复制的惩罚等。但有时(特别是使用仪器分析器)我们希望绝对避免在中断处理程序期间进行分配。
然而,通常我们会通过其他方式避免中断和分配问题:
请注意,无锁数据结构可以作为此处第二个项目的替代方案,我们尚未设置并进行分析以查看它是否有帮助。无论如何,设计自己的产品是一件棘手的事情。
对于中断处理程序来说,偏执是勇敢的一部分:如果您不确定自己正在做的事情是否有效,有时以完全不同的方式解决问题会更好。
| 归档时间: |
|
| 查看次数: |
4969 次 |
| 最近记录: |