我应该使用什么c ++ 11范例来最小化内存使用并最小化复制?

kfm*_*e04 5 c++ memory interface ownership c++11

问题

我有一个抽象的接口Series和一个具体的类Primary_Series,它通过存储大量std::vector<>的值来满足接口.

我还有另一个具体的类Derived_Series,它本质上是一个变换Primary_Series(例如一些大的Primary_Series乘以3),我想要节省空间,所以我不想将整个派生系列存储为成员.

template<typename T>
struct Series
{
  virtual std::vector<T> const& ref() const = 0;
};

template<typename T>
class Primary_Series : Series<T>
{
  std::vector<T>  m_data;
public:
  virtual std::vector<T> const& ref() const override { return m_data; }
}

template<typename T>
class Derived_Series : Series<T>
{
  // how to implement ref() ?
}
Run Code Online (Sandbox Code Playgroud)

我该如何更改此接口/纯虚方法?

我不想按值返回该向量,因为它会引入不必要的复制Primary_Series,但在这种Derived_Series情况下,我肯定需要创建某种临时向量.但是接下来我面临的问题是,一旦调用者完成了该向量,我该如何使该向量消失.

如果ref()返回对临时的引用会随着引用的消失而消失,那将是很好的.

这是否意味着我应该使用某种std::weak_ptr<>?这适合如何Primary_Series运作?

满足"最小化内存使用"和"最小化复制"要求的最佳方法是什么,包括Derived_Series在调用者完成后使临时消失?

Mas*_*eek 1

一种解决方案是使用 astd::shared_ptr<vector<T> >将向量存储在基类中,并使用它返回向量的值。基类仅返回其成员值,派生类创建一个新向量并通过共享指针返回该向量。然后当调用者不再需要派生类的返回值时,它将自动销毁。

或者,您可以设计您的类来模仿 的接口std::vector<T>,但设计基类,使其返回转换后的值而不是常规值。这样,就无需返回。如果您不想为 astd::vector<T>具有的所有函数编写方法,您可以创建某种可以迭代和转换 a 的转换迭代器std::vector<T>。那么你甚至不需要有复杂的类层次结构。