在阅读了关于自定义分配器的(长篇)文章之后: -
做了一些简单的测试,我意识到他们可以大大提高我的软件性能。
我觉得在大多数情况下,他们适度采用中度简单,
除非函数想要返回非POD类型的情况。
我创建了2个系统SystemA
和SystemB
为简单起见,它们是单例,可以全局访问。
SystemA* systemA;
SystemB* systemB;
两个系统都拥有每种类型的分配器: -
class SystemA/SystemB{
Allo oneFrameAllo=oneFrameAllocator();
Allo heapAllo=heapAllocator();
};
按照设计,systemB
想要请求Report* report=systemA->generateReport()
示例: SystemB
(AI-System
)查询来自SystemA
(NPC-Manager
)的所有敌方信息。
在SystemA::generateReport()
中更喜欢使用自己的分配器SystemA::oneFrameAllo
来做内部事务,
但systemB
期望使用SystemB::heapAllo
的结果。
如何实现?
注意:在实际情况中,Report
是非POD,因此按值返回Report
并不方便。
这是compilable demo
它使用“传递分配器作为参数”方法。 (John Zwinck建议,谢谢!)
这里只显示了必要的部分: -
class SystemA{
Allo oneFrameAllo;
Allo heapAllo;
public: Strong_Pointer<Report> generateReport(Allo* allo){
/* use the one-frame-allocator to do internal computation */
Strong_Pointer<int> some_temporary_variable=oneFrameAllo.allocate<int>();
*(some_temporary_variable.ptr)=5; //result of #1 above
Strong_Pointer<Report> r=allo->allocate<Report>();
r.ptr->someInfo = allo->allocate<int>();
*((r.ptr->someInfo).ptr)=*(some_temporary_variable.ptr);//#2
return r;
}
};
SystemA* systemA=new SystemA();
class SystemB{
Allo oneFrameAllo;
Allo heapAllo;
Strong_Pointer<Report> report;
public: void update(){
report=systemA->generateReport(&heapAllo);
}
};
SystemB* systemB=new SystemB();
我仍然不确定这是不是正确的方法。
缺点: -
(次要)功能界面将变得非常支持分配器: -
否则,它会使用默认参数中断现有功能,例如
f(X x=X()){} -> call f() is OK
become
f(X x=X(),Allo* allo){} -> f( must insert X() manually, &allo)
真的,我必须将这个单个参数添加到现有代码库中的许多功能中 它真的好吗?
另一种方法是让SystemB
创建一个包含字段Allo*
,
的报告
并将&report
作为systemA->generateReport()
的参数传递。
SystemA
将填写 report
。 (感谢vu1p3n0x)
请提供更好的方法或确认这种方法已经很好。
然后,提供一些参考资料,表明它确实是一种专业的方法。