通过const引用传递对象与传递无名对象

时间:2013-11-12 11:13:16

标签: c++ oop reference const pass-by-reference

C ++ 11;

给定两个类,A类和B类,其中A类存储B类的数据成员,它的效率更高;

1:创建一个B类型的对象,然后输入A,然后将类型A的对象传递给类型为B的对象的const引用;

A storage;
B object(1,2,3);
storage.add(object);

2:创建A类型的对象,并将其传递给B类型的无名对象,例如;

A storage;
storage.add(B(1,2,3));

这些呼叫在性能方面是否相同?

现在假设我想要一个A类型的向量来存储我传入类型A的B类对象;每次调用storage.add()时,我是否会制作两个类型B的副本,无论我是否将存储对象传递给已创建的对象或将匿名对象直接传递给类型A的对象?

在A类中存储B对象的向量的情况下,传递类型B的无名对象,将它们存储在向量中,返回指向向量元素的指针或创建对象会更有效吗?类型B,并将指针传递给storage.add()并将类型B的对象存储在指针向量中?

我希望我的意图明确。如果我的意图不太明确,我会发布一个代码示例。我只是不确定传递对象的最有效方法是什么时候我还需要通过调用我的存储类来返回它们。

1 个答案:

答案 0 :(得分:0)

  

这些呼叫在性能方面是否相同?

在具有新移动语义的C ++ 11中,性能大致相同。如果您使用自己的类,请确保它们实现移动构造函数和移动赋值运算符。

  

在A类中存储B对象的向量的情况下,传递类型B的无名对象,将它们存储在向量中,返回指向向量元素的指针或创建对象会更有效吗?类型B,并将指针传递给storage.add()并将类型B的对象存储在指针向量中?

如果您正在引用STL向量,则使用匿名对象可以获得最佳性能,否则,您的对象将被复制,因为STL存储值而不是引用。

从集合中返回对象的经验法则是通过 reference 返回它们。这就是STL vector

所遵循的模式

当您存储指针而不是值时,您正在将内存的所有权更改为向量类的客户端,因为通常,创建对象的人员也应负责解除分配它。