1

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 的对象;无论我是向存储对象传递对已创建对象的引用还是将匿名对象直接传递给 A 类型的对象,我是否会在每次调用 storage.add() 时制作两个 B 类型的副本?

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

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

4

1 回答 1

0

这些调用在性能方面是否相同?

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

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

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

从集合中返回对象的经验法则是通过引用返回它们。这就是 STL向量所遵循的模式

当您存储指针而不是值时,您正在将内存的所有权更改为向量类的客户端,因为通常情况下,创建对象的人也应该负责释放它。

于 2013-11-12T14:18:59.367 回答