vector <foo>的内存布局包含一些foo_subclass元素</foo>

时间:2013-12-02 22:12:42

标签: c++ vector

我正在对一些大量使用std::vector<foo>的算法进行过早优化。我的一个优化涉及为某些情况子类化foo,这意味着vector<foo>将同时包含foofoo_subclass

foo只有char*int,而foo_subclass只有std::string。我的理解是,这些中的每一个都会在向量中占据固定宽度的插槽(带有foo_subclass字符串的指针),但是当它们混合时如何在容器中分配? / p>

1 个答案:

答案 0 :(得分:3)

简短的回答是“你不能这样做”。 std::vector<foo>无法包含foo_subclass:如果您尝试将foo_subclass放入vector,则会对foo的{​​{1}}组件进行切片,制作该副本,并将foo_subclass放入foo

答案越长,有两种方法可以解决这个问题。

首先,您可以创建一个vector - std::vector< std::unique_ptr<foo> >拥有智能指针vector。如果foo~foo,这将非常愉快。您丢失了连续的数据。您必须了解virtual,但无论如何都应该了解unique_ptr

其次,您可以创建unique_ptr或同等产品。在这种情况下,最终存在足够的std::vector< boost::variant< foo, foo_subclass > >foo存储空间,并且在访问点,用户必须确定它们是否正在获取其中一个。从理论上讲,您甚至可以编写自己的变体foo_subclass,以便它知道存储的类型是相关的,您可以访问variant,只访问foo个实例。子类。

第一个是更容易,第二个是更先进的技术,可能不值得你打扰。