C++ 没有指针(包括智能指针)或副本的高效工厂函数?

C++ 没有指针(包括智能指针)或副本的高效工厂函数?,c++,performance,factory,C++,Performance,Factory,假设我有一种工厂函数,它创建的对象大部分只在很短的时间跨度内使用(可能只在调用工厂函数的函数范围内使用) 像这样: foo factory(some_parameter fancy_parameter) { return foo(fancy_parameter); } //this gets called all the time... very often void every_frame_function() { for(int i=0; i<big_number; ++

假设我有一种工厂函数,它创建的对象大部分只在很短的时间跨度内使用(可能只在调用工厂函数的函数范围内使用)

像这样:

foo factory(some_parameter fancy_parameter)
{
   return foo(fancy_parameter);
}

//this gets called all the time... very often
void every_frame_function()
{
   for(int i=0; i<big_number; ++i)
       do_something_with(factory(some_parameter(i));

} //don't need those foos out here!
foo工厂(某些参数)
{
返回foo(fancy_参数);
}
//这个电话一直在打。。。经常
无效每个_帧_函数()
{
对于(int i=0;iUse
std::unique_ptr
),与原始指针相比,它的开销为零


或者只按值返回,但不能执行子类型多态性。

编译器在许多情况下会优化副本,具体取决于您对副本的处理方式。例如:

type create();
void test {
   type local = create();       // Copy will be elided
   type const & ref = create(); // Extra copy will be elided
   local = create();
}
这是假设
create
以可以应用(N)RVO的方式实现,否则在从
create
返回之前会有另一个内部副本


现在,有趣的是确定这是否是正确的方法,我们不能这样做,因为您没有提供有关问题的足够信息。例如,工厂返回的对象创建成本有多高,它们是否拥有资源,或者您是否可以重用对象…

我认为这是一个问题关于深拷贝和浅拷贝。指针类似于浅拷贝

两份副本的详细信息:


如果在另一个函数中不使用指针,则必须在代码中使用深度副本。如果对象非常大,深度副本将花费大量时间,导致程序非常慢。在您关于二维向量的示例中,两个副本之间的差异不明显。但如果对象像复杂的对话框一样大,则效果会非常明显非常清楚。

好吧,你不能用工厂函数来做,但你可以用类来做:

class Factory {
public:
   Base &create_obj(some_param p)
   {
      d.p =p;
      return d;
   }
 private:
   Derived d;
};
void every_frame_function() {
   Factory f;
   for(int i=0;i<bignumber;i++)
     {
     do_something_with(f.create_obj(some_parameter(i)));
     }
}
类工厂{
公众:
基础和创建对象(某些参数)
{
d、 p=p;
返回d;
}
私人:
导出d;
};
无效每个_帧_函数(){
f厂;

对于(int i=0;IDO,您每次都想创建一个新工厂)每次调用FaseYes()?或者每次工作时都返回同一个工厂?智能指针的问题是什么?它们是现代C++工作的基础。碰撞检测我需要边界框,它包含13个二维向量(4个角顶点、4个边顶点、4个法线顶点和一个中心顶点,总共26个浮动)。factory函数用于创建特定类型的边界框。这些边界框中的大多数是永久保留的;但是,我也有很多动态创建的对象,我需要为它们中的每一个创建边界框。这不是性能杀手,我也不喜欢过早优化,但我问过以防万一是一种无需黑客就能轻松实现的东西。厌倦了对派生工厂的切片。