
问题:在STL列表和向量中阻止malloc()调用的最佳方法是什么?是否足以创建具有预定义大小的结构,然后避免推/d/擦除调用?
先感谢您
解决方法 作为推荐:我们在我的工作场所使用其他答案中提到的两种方法:>自定义分配器:对于我们的内存泄漏跟踪系统,我们的仪器分析器和一些其他系统,我们使用提供的分配器预分配和/或“池”(参见例如boost :: pool)分配 – 通常用于std :: set或std :: map,但std :: List的原理相同.
> reserve / resize:对于std :: vectors,我们提前保留或调整大小(差异很重要,但两者都可以帮助避免将来的分配)是非常常见的做法.
大多数情况下,我们会做这两件事以避免碎片,减少分配器开销,消除复制增加的惩罚等.但有时(特别是对于仪表分析器)我们希望绝对避免在中断处理程序中进行分配.
但是,通常我们会以其他方式避免中断和分配问题:
>进入/退出:尽量避免在中断期间执行除标志或普通副本之外的任何 *** 作;有时静态(或预分配)缓冲区是比STL容器好得多的解决方案.持续中断时间过长通常会导致灾难.
>在alloc / free期间禁用中断:在我们分配/释放时,中断排队,而不是立即调度 – 这是我们正在使用的cpu的一个功能.结合有选择地增加禁用/排队范围的策略(例如std :: List *** 作),我们有时可以使用中断处理程序作为生产者,一切 – 其他作为消费者模型,而不是覆盖分配器.如果我们正在从std :: List中消费某些东西(例如从网络硬件接收到的消息),那么中断会在尽可能短的时间内排队,同时d出我们即将处理的内容的副本.
请注意,无锁数据结构可以替代此处的第二个项目符号,我们还没有设置和完成分析以查看它是否有用.无论如何,设计自己的业务是棘手的事情.
对于中断处理程序来说,偏执狂是更好的部分:如果你不确定你所做的事情会起作用,那么以一种完全不同的方式解决问题有时会好得多.
总结以上是内存溢出为你收集整理的c – std :: list,std :: vector方法和malloc()全部内容,希望文章能够帮你解决c – std :: list,std :: vector方法和malloc()所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)