引导另一个类的函数使用自定义分配器

时间:2017-05-27 04:02:43

标签: c++ optimization memory-management c++14 allocator

在阅读了关于自定义分配器的(长篇)文章之后: -

做了一些简单的测试,我意识到他们可以大大提高我的软件性能。

我觉得在大多数情况下,他们适度采用中度简单,
除非函数想要返回非POD类型的情况。

实施例

我创建了2个系统SystemASystemB 为简单起见,它们是单例,可以全局访问。

SystemA* systemA; 
SystemB* systemB; 

两个系统都拥有每种类型的分配器: -

class SystemA/SystemB{
    Allo oneFrameAllo=oneFrameAllocator();  
    Allo heapAllo=heapAllocator();  
};

按照设计,systemB想要请求Report* report=systemA->generateReport() 示例: SystemBAI-System)查询来自SystemANPC-Manager)的所有敌方信息。

SystemA::generateReport()中更喜欢使用自己的分配器SystemA::oneFrameAllo来做内部事务, 但systemB期望使用SystemB::heapAllo的结果。

enter image description here

如何实现?
注意:在实际情况中,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();

我仍然不确定这是不是正确的方法。

缺点: -

  • 很脏:附加参数。
  • (次要)功能界面将变得非常支持分配器: -

    • 如果allocator是第一个参数:在大多数情况下我不能使它成为默认参数。
    • 否则,它会使用默认参数中断现有功能,例如

      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)

请提供更好的方法或确认这种方法已经很好。
然后,提供一些参考资料,表明它确实是一种专业的方法。

0 个答案:

没有答案