加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – std :: list,std :: vector方法和malloc()

发布时间:2020-12-16 06:49:44 所属栏目:百科 来源:网络整理
导读:在中断处理程序下使用stl:list和stl :: vector类型我想避免malloc()调用. 问题:在STL列表和向量中阻止malloc()调用的最佳方法是什么?是否足以创建具有预定义大小的结构,然后避免推/弹/擦除调用? 先感谢您 解决方法 作为推荐:我们在我的工作场所使用其他
在中断处理程序下使用stl:list和stl :: vector类型我想避免malloc()调用.

问题:在STL列表和向量中阻止malloc()调用的最佳方法是什么?是否足以创建具有预定义大小的结构,然后避免推/弹/擦除调用?

先感谢您

解决方法

作为推荐:我们在我的工作场所使用其他答案中提到的两种方法:

>自定义分配器:对于我们的内存泄漏跟踪系统,我们的仪器分析器和一些其他系统,我们使用提供的分配器预分配和/或“池”(参见例如boost :: pool)分配 – 通常用于std :: set或std :: map,但std :: list的原理相同.
> reserve / resize:对于std :: vectors,我们提前保留或调整大小(差异很重要,但两者都可以帮助避免将来的分配)是非常常见的做法.

大多数情况下,我们会做这两件事以避免碎片,减少分配器开销,消除复制增加的惩罚等.但有时(特别是对于仪表分析器)我们希望绝对避免在中断处理程序中进行分配.

但是,通常我们会以其他方式避免中断和分配问题:

>进入/退出:尽量避免在中断期间执行除标志或普通副本之外的任何操作;有时静态(或预分配)缓冲区是比STL容器好得多的解决方案.持续中断时间过长通常会导致灾难.
>在alloc / free期间禁用中断:在我们分配/释放时,中断排队,而不是立即调度 – 这是我们正在使用的CPU的一个功能.结合有选择地增加禁用/排队范围的策略(例如std :: list操作),我们有时可以使用中断处理程序作为生产者,一切 – 其他作为消费者模型,而不是覆盖分配器.如果我们正在从std :: list中消费某些东西(例如从网络硬件接收到的消息),那么中断会在尽可能短的时间内排队,同时弹出我们即将处理的内容的副本.

请注意,无锁数据结构可以替代此处的第二个项目符号,我们还没有设置和完成分析以查看它是否有用.无论如何,设计自己的业务是棘手的事情.

对于中断处理程序来说,偏执狂是更好的部分:如果你不确定你所做的事情会起作用,那么以一种完全不同的方式解决问题有时会好得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读