有多少种生成临时对象的方法/不必要地调用构造函数?

时间:2013-05-29 19:17:11

标签: c++ performance optimization

临时对象/浪费对象可能是超低延迟应用程序的一大瓶颈。我试图让自己意识到不必要地调用构造函数的陷阱,所以我想知道是否有任何我不知道的方法。当构建器被“静默地”调用时,我知道以下几种方法:

1)

//a temporary "object" is created when adding x and y and then assigned to z
int x,y,z;
z = x + y;    

2)

//A temporary object is created here when the return value is passed. Its also possible
//another temporary object is created during the assignment?
A a = my_function();

A my_function(){
    return new A();
}

3)

A a = my_function();

A my_function(){
    A a;
    return a;
}

4)参数按值传递

A a;
my_function(a);

void my_function(A a){

}

5)不使用初始化列表:

class A{
   B b;
   C c;

   A(B bb, C cc):
   {
       this.b = bb;
       this.c = cc;
   }

}

是否有其他示例隐式调用构造函数?

3 个答案:

答案 0 :(得分:0)

A a = A();(你的函数示例的一个更简单的例子),虽然我相信这些天大多数编译器都优化它以直接初始化。 (但GCC可以选择禁用该优化。)

顺便说一句,您可能需要查看http://en.wikipedia.org/wiki/Copy_constructor

答案 1 :(得分:0)

中,右值引用和移动语义可以解决几种类型的不必要的临时副本,这些副本在诸如按值返回和传递参数的情况下发生。因此,您列出的一些注意事项不再适用于新标准。

答案 2 :(得分:0)

IMO你要倒退了。特别是考虑到在优化构建中,大多数情况下都会完全删除所有临时工具。

建议的方法是以易于查看的样式编写正确的程序。然后,如果您对性能不满意,请将分析器丢弃,并修复占用大部分时间的小部分。实践证明,程序员认为它很少。

从列表中避免的一件事是具有不可预测大小的类类型的值。大部分时间都是const&没关系。

避免分配并坚持初始化也是一个很好的指导方针,但不是出于性能原因。当然,它通常不适用于某些类型的集合。