关于C++:哪个更好:存储对象和存储指针?

Which is better: storing objects vs storing pointers?

本问题已经有最佳答案,请猛点这里访问。

我想存储元素(我们称之为e),但我不知道应该将它们存储为对象或指向动态分配对象的指针。

(A、B、C等对象存储所需E的引用)

版本A:

1
2
E e;
store.Add(e); //This time the store contains objects.

在这个版本中,元素将被复制到存储区,但更容易处理。(父对象被销毁时,对象将被销毁)

版本B:

1
2
3
4
E* e = new E();
store.Add(*e); //This time the store contains references.
/*I chose references instead of pointers,
so I have to use pointers only at allocating and deallocating.*/

在这个版本中没有copy constr。但是我必须删除父对象析构函数中的对象。

哪个更好,为什么?哪一个会导致更多的错误,哪一个更有效?


这取决于你如何使用你的商店。存储对象意味着在调用Add时,以及在复制存储时(在其他情况下):这可能会产生成本,并可能导致不必要的行为。

指针可能是一个不错的选择,但是您应该更喜欢托管指针,比如std::unique_ptr,所以您不必处理删除。

版本C:

1
2
auto e = std::unique_ptr<E>(new E());
store.Add(e); //This time the store contains managed pointers.

如果你有C++ 14,你也可以使用EDCOX1 2。

版本C:

1
2
auto e = std::make_unique<E>();
store.Add(e); //This time the store contains managed pointers.

如果需要共享指向对象,另一种选择是使用std::shared_ptr,但仅在需要时使用。

版本D:

1
2
auto e = std::make_shared<E>();
store.Add(e); //This time the store contains shared managed pointers.

随着C++ 11的前进,你也可以直接在容器内部构建它们:

1
2
std::vector<Widget> widgets;
widgets.emplace_back(/*Parameters to construct a widget*/);

Which is better and why?

这取决于你的申请。如果容器应该拥有对象,并且复制对象的成本不高,那么值语义就更容易了。如果它们可以扩展到复制,但很容易移动,那么标准容器将移动它们(当然,您必须提供移动构造函数)。

通过存储智能指针,您还可以拥有两个世界中最好的。这样,如果这是一个需求,您就可以得到多态性。

1
2
std::vector<std::unique_ptr<Widget>> widgets;
widgets.push_back(std::make_unique<Widget>(/*Parameters to construct a widget*/));

Which can cause more mistakes and which is more efficient?

第一个问题完全取决于你作为一个程序员的技能,第二个问题不能用一个笼统的语句来回答。为了提高效率,需要对程序进行基准测试和分析。