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。但是我必须删除父对象析构函数中的对象。
哪个更好,为什么?哪一个会导致更多的错误,哪一个更有效?
这取决于你如何使用你的商店。存储对象意味着在调用
指针可能是一个不错的选择,但是您应该更喜欢托管指针,比如
版本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. |
如果需要共享指向对象,另一种选择是使用
版本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?
第一个问题完全取决于你作为一个程序员的技能,第二个问题不能用一个笼统的语句来回答。为了提高效率,需要对程序进行基准测试和分析。