临时对象/浪费对象可能是超低延迟应用程序的一大瓶颈。我试图让自己意识到不必要地调用构造函数的陷阱,所以我想知道是否有任何我不知道的方法。当构建器被“静默地”调用时,我知道以下几种方法:
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;
}
}
是否有其他示例隐式调用构造函数?
答案 0 :(得分:0)
A a = A();
(你的函数示例的一个更简单的例子),虽然我相信这些天大多数编译器都优化它以直接初始化。 (但GCC可以选择禁用该优化。)
顺便说一句,您可能需要查看http://en.wikipedia.org/wiki/Copy_constructor。
答案 1 :(得分:0)
在c++11中,右值引用和移动语义可以解决几种类型的不必要的临时副本,这些副本在诸如按值返回和传递参数的情况下发生。因此,您列出的一些注意事项不再适用于新标准。
答案 2 :(得分:0)
IMO你要倒退了。特别是考虑到在优化构建中,大多数情况下都会完全删除所有临时工具。
建议的方法是以易于查看的样式编写正确的程序。然后,如果您对性能不满意,请将分析器丢弃,并修复占用大部分时间的小部分。实践证明,程序员认为它很少。
从列表中避免的一件事是具有不可预测大小的类类型的值。大部分时间都是const&没关系。
避免分配并坚持初始化也是一个很好的指导方针,但不是出于性能原因。当然,它通常不适用于某些类型的集合。