C++ Tensor类,它有自己的存储,但也可以映射外部指针

C++ Tensor类,它有自己的存储,但也可以映射外部指针,c++,c++14,C++,C++14,我正在设计一个张量类。现在,我想对它进行扩展,使其也能够映射(查看)指向某个外部数据数组(在外部保持活动状态)的指针。我目前的方法是引入一个容器(下面是m_容器),并通过指针(下面是m_数据)引用它。为了映射,我可以简单地让m_数据指向外部,而不是m_容器。问题是它在我的任何一个小示例中都能工作,但在更大的代码中它有时会失败(即使不使用“映射”) 我知道这是一个模糊的问题。这也是我无法集中注意力的原因。也许这个问题对其他人来说是显而易见的 class Foo { private: doub

我正在设计一个张量类。现在,我想对它进行扩展,使其也能够映射(查看)指向某个外部数据数组(在外部保持活动状态)的指针。我目前的方法是引入一个容器(下面是
m_容器
),并通过指针(下面是
m_数据
)引用它。为了映射,我可以简单地让
m_数据
指向外部,而不是
m_容器
。问题是它在我的任何一个小示例中都能工作,但在更大的代码中它有时会失败(即使不使用“映射”)

我知道这是一个模糊的问题。这也是我无法集中注意力的原因。也许这个问题对其他人来说是显而易见的

class Foo
{
private:

  double m_container[2];
  double *m_data = &m_container[0];

public:

  Foo(){}

  double& operator[](size_t i) { return m_data[i]; }

  void map(double *D) { m_data = D; }

  void copy(const double *D)
  {
    for ( size_t i = 0 ; i < 2 ; ++i )
      m_data[i] = D[i];
  }
};

int main()
{
  double data[2];

  data[0] = 0.;
  data[1] = 1.;

  Foo A;
  A.map(data);
}
class-Foo
{
私人:
双m_容器[2];
双*m_数据=&m_容器[0];
公众:
Foo(){}
双精度&operator[](size_t i){返回m_数据[i];}
void映射(double*D){m_data=D;}
无效副本(常数双*D)
{
对于(尺寸i=0;i<2;++i)
m_数据[i]=D[i];
}
};
int main()
{
双数据[2];
数据[0]=0。;
数据[1]=1。;
福阿;
A.地图(数据);
}

将张量类分为两类

张量视图和张量实例

实例可以转换为视图,但视图不能转换为实例

现在,观点本身可以分为两种不同的类型;切片或跨度是观察者。切片可用于编辑其元素数据源中的元素数据,但观察者不能。您可能不需要切片,您应该首先编写观察者

一旦你有了这些类型,你就可以制作只需要你在算法中需要的类型的算法。它很少是一个完整的张量实例


您必须仔细管理所有查看内容的生命周期。如果您觉得这很难,而且很难做得更好(而且很难,整个语言都是在性能下降2-3倍的情况下编写的,只是为了避免手动解决此问题),您可以修改视图类型以要求共享阵列数据的所有权,并将堆上的所有张量数据存储在共享指针中。这是有代价的。

感谢您的回复。如果我把这两个功能分开,这听起来很合理,我怎么能让这两个功能都接受呢?我特别希望避免空指针以增强可读性。@tom实例隐式转换为视图。视图是引用的抽象。我明白了。最后一件事。。。我的方法到底出了什么问题?也就是说,不管风格如何,为什么这个类有时会返回gibberish,表明
m_container
已被释放?@TomdeGeus您没有遵循5的规则。使一个元素指向另一个元素的构造函数不能使用默认的复制/移动/销毁默认成员函数。