【问题标题】:Is there a (deep) copy constructor for pybind11::array_t?pybind11::array_t 是否有(深)复制构造函数?
【发布时间】:2019-06-13 07:22:32
【问题描述】:

我有一个现有的pybind11::array_t,需要进行复制构建。 pybind11 中是否有允许我对 array_t 进行深层复制的函数?

我知道我可以创建一个新的array_t,调整它的大小,然后将原始数据复制到其中,但我想知道是否已经存在隐藏这些段落的方法。

【问题讨论】:

  • 你确定auto copy = original; 没有做你想做的事吗?
  • 是的,因为这涉及到浅拷贝。这个 sn-p 打印相同的地址:using py_arr = pybind11::array_t<double>; py_arr a; auto b = a; std::cout << b.data() << " " << a.data() << std::endl;

标签: python c++ pybind11


【解决方案1】:

默认的复制构造函数执行深拷贝,people are actually trying to avoid this :)

要使用复制构造函数,可以通过buffer

using py_arr = pybind11::array_t<double>;
py_arr a;

// do stuff with a, fill it and everything...

auto buffer = a.request(); 
py_arr b = py_arr(buffer);

std::cout << b.data() << " " << a.data() << std::endl; // this won't return the same address twice

【讨论】:

  • 感谢您的评论。 (a) 我同意缓冲选项。但是,request 是一个 const 方法,因此如果您在某处有一个接受const pybind11::array_t &amp; a 的函数,并且想要创建它的深层副本,则需要const_cast。这就是我要求深拷贝构造函数或类似方法的原因。 (2) py::array_t 的默认复制构造函数执行 shallow 复制。 using py_arr = pybind11::array_t&lt;double&gt;; py_arr a; py_arr b(a); std::cout &lt;&lt; b.data() &lt;&lt; " " &lt;&lt; a.data() &lt;&lt; std::endl; 打印相同的地址。
  • 如果没有其他选择,我可以使用缓冲区,但我希望有一种替代的、更紧凑的方式也适用于 const 情况。
  • 哦,我明白了,您可以使用我刚刚给出的实现重载 = 运算符(请参阅 this answer),这应该可以解决您的问题吧?
  • 嗨,很抱歉回复晚了 :) 是的,我可以重载它,但它会破坏语义。有些地方我需要浅拷贝,有些地方我需要深拷贝。我想我将只使用缓冲区,即使我必须const_cast。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多