Swig - 存储未知对象直到下一次调用 C++ 函数
Swig - store unknown object until next call of C++ function
我正在使用带 python 的 swig 来调用用 C++ 编写的函数 myfunc()。每次调用 myfunc() 时,我都必须生成相同的巨大稀疏矩阵。相反,我想做的是创建一次矩阵,然后将矩阵的指针传递给 python,而不是每次都重新分配 space。我担心的是这可能会导致某种内存泄漏。
最好的方法是什么?
矩阵是 Eigen::SparseMatrix 的一部分。
简单地来回传递一个指针是否可以节省? Python 不知道如何处理它,但只要 space 保持分配状态,我就能在 C++ 中重用指针吗?
这正是 swig 处理未知对象的方式:它传递指向对象的指针以及一些类型信息(字符串)。如果一个函数采用该类型的指针作为参数,swig 会很乐意将那个指针传递给它。请参阅 swig 文档 here.
您只需确保类型匹配,即您不能将 MatrixXd*
传递给 python 并在采用 MatrixBase<MatrixXd>*
的函数中使用它,因为 swig不知道类型是否兼容。
此外,对于未知对象(至少是指向此类对象的指针),swig 不会进行任何内存管理,因此您需要在 C++ 端分配和释放对象。
我正在使用带 python 的 swig 来调用用 C++ 编写的函数 myfunc()。每次调用 myfunc() 时,我都必须生成相同的巨大稀疏矩阵。相反,我想做的是创建一次矩阵,然后将矩阵的指针传递给 python,而不是每次都重新分配 space。我担心的是这可能会导致某种内存泄漏。
最好的方法是什么?
矩阵是 Eigen::SparseMatrix 的一部分。
简单地来回传递一个指针是否可以节省? Python 不知道如何处理它,但只要 space 保持分配状态,我就能在 C++ 中重用指针吗?
这正是 swig 处理未知对象的方式:它传递指向对象的指针以及一些类型信息(字符串)。如果一个函数采用该类型的指针作为参数,swig 会很乐意将那个指针传递给它。请参阅 swig 文档 here.
您只需确保类型匹配,即您不能将 MatrixXd*
传递给 python 并在采用 MatrixBase<MatrixXd>*
的函数中使用它,因为 swig不知道类型是否兼容。
此外,对于未知对象(至少是指向此类对象的指针),swig 不会进行任何内存管理,因此您需要在 C++ 端分配和释放对象。