有多少种方法可以生成临时对象/不必要地调用构造函数
How many ways of generating temporary objects/needlessly invoking constructor are there?
临时对象/浪费对象可能是超低延迟应用程序的一大瓶颈。我试图让自己意识到不必要地调用构造函数的陷阱,所以我想知道是否有我不知道的方法。当构造函数被"静默"调用时,我知道以下几种方式:
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中,右值引用和移动语义可以解决几种类型的不必要的临时副本,这种情况发生在按值返回和传递参数的情况下。所以你列出的一些禁忌不再适用于新标准。
相关文章:
- 在不复制临时对象的情况下延长其生存期
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 对临时对象的Const引用不会延长其生存期
- 将项添加到矢量而不创建临时对象
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 为什么常量引用不能延长通过函数传递的临时对象的生存期?
- 为什么延长临时对象的寿命不会导致中间临时对象的延长
- C++填充一个std::map创建不必要的对象
- 避免对临时、R 值析构函数进行不必要的分配
- 为什么我不能直接在临时对象上调用 operator()?
- 不必要的对象复制 - C++ STL
- 是否可以按值传递临时对象而不破坏C++中的原始对象
- 为什么在传递临时对象时不调用复制构造函数
- Visual Studio 在类型转换时不会创建临时对象
- 为什么不从临时对象中调用move ctor进行构造(运算符+的结果)
- 为什么我构建的临时对象const不可变
- 向列表中添加临时对象,不需要动态内存分配
- 为什么不调用复制构造函数将临时对象复制到新定义的对象
- 如何防止对对象进行不必要的复制