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

How many ways of generating temporary objects/needlessly invoking constructor are there?

本文关键字:临时对象 不必要 构造函数 调用 多少 方法      更新时间:2023-10-16

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

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)参数通过value

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

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

A a = A();(函数示例的一个更简单的例子),尽管我相信现在大多数编译器都将其优化为直接初始化。(GCC有一个选项来禁用这个优化。)

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

我觉得你是在倒退。特别是考虑到在优化构建中,大多数情况下将完全删除所有临时。

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

列表中要避免的一件事是,对于大小不可预测的类类型,按值进行参数配置。大多数时间不变;是好的。

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

在c++11中,右值引用和移动语义可以解决几种类型的不必要的临时副本,这种情况发生在按值返回和传递参数的情况下。所以你列出的一些禁忌不再适用于新标准。