1

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

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;
   }

}

还有其他隐式调用构造函数的例子吗?

4

3 回答 3

0

In , rvalue references and move semantics can solve several types of unnecessary copies of temporaries, which occur in situations such as returning and passing arguments by value. So some of the don'ts you listed no longer apply in the new standard.

于 2013-05-29T19:43:51.100 回答
0

海事组织你正在倒退。特别是考虑到在优化构建中,您的大多数案例将完全删除所有临时对象。

建议的方法是以易于查看的风格编写正确的程序。然后,如果您对性能不满意,请将分析器放在它上面,并修复占用大部分时间的小部分。实践表明,程序员认为它会出现的情况很少见。

从您的列表中避免的一件事是具有不可预测大小的类类型的参数值。大多数时候 const& 没问题。

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

于 2013-05-29T21:12:13.647 回答
0

A a = A();(您的函数示例的一个更简单的情况),尽管我相信现在大多数编译器都将其优化为直接初始化。(不过,GCC 可以选择禁用该优化。)

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

于 2013-05-29T19:22:37.987 回答