哪个更好:存储对象vs存储指针?
这个问题在这里已经有了答案:
这取决于你如何使用你的商店。 存储对象意味着在调用Add
时以及复制存储时(以及其他情况),您将复制这些对象:这可能会带来成本,并且可能导致不需要的行为。
指针可能是一个很好的选择,但是你应该更喜欢托管指针,比如std::unique_ptr
,所以你不必处理删除操作。
版本C:
auto e = std::unique_ptr<E>(new E());
store.Add(e); //This time the store contains managed pointers.
如果您有C ++ 14可用,您也可以使用std::make_unique
。
版本C之二:
auto e = std::make_unique<E>();
store.Add(e); //This time the store contains managed pointers.
如果您需要共享指向对象的另一个选项可以使用std::shared_ptr
,但仅在需要时才使用它。
版本D:
auto e = std::make_shared<E>();
store.Add(e); //This time the store contains shared managed pointers.
随着c ++ 11的继续,你也可以直接在容器中构建它们:
std::vector<Widget> widgets;
widgets.emplace_back(/*Parameters to construct a widget*/);
哪个更好?为什么?
这取决于你的应用程序。 如果容器应该拥有这些对象,并且它们不太复制,那么值语义更容易。 如果它们广泛地复制,但很容易移动,标准容器将会移动它们(您当然必须提供移动构造函数)。
您也可以通过存储智能指针来获得两全其美的效果。 这样你就会得到多态,如果这是一个要求。
std::vector<std::unique_ptr<Widget>> widgets;
widgets.push_back(std::make_unique<Widget>(/*Parameters to construct a widget*/));
哪些会导致更多的错误,哪些更有效?
第一个问题完全取决于你作为程序员的技能,而第二个问题不能用一揽子语句来回答。 程序需要进行基准测试并进行效率分析。
链接地址: http://www.djcxy.com/p/31641.html