首页 > 解决方案 > C++ 对 Python 的扩展——安全的内存访问和内存布局

问题描述

我正在使用作用于 Numpy 数组(非常大)的 c++ 函数来扩展 python 代码。由于遗留问题,我目前同时拥有 PyBind 和 Python API 函数,都适用于 Python 3.6 及更高版本。一旦我通过 ptr 访问内存,我很想确保内存布局与此 ptr 下的 c++ 数组完全对应。我发现在这两种情况下,转置数组在 ptr 中的内容完全相同。我还发现通过 Python API 发送的子数组在 c++ 中给出的 ptr 与完整数组完全相同。在开发和测试的过程中,我也观察到了更多我认为奇怪的例子,但不能再重现它们了。到目前为止,我在互联网上找不到任何食谱。我的解决方案是在 Python 中复制所有输入数组,例如 f(a.copy(), b.copy())

它似乎运作良好。这是最佳/充分的解决方案吗?我对如何生成输入数组没有任何限制。任何组合的转置、子阵列、重塑。

标签: pythonc++numpypybind11

解决方案


使用 pybind11,您可以使用py::array::c_styleMatt Eding 链接中描述的标志。Numpy 的C API通过NPY_ARRAY_C_CONTIGUOUS标志提供了几乎相同的功能。无论哪种情况,如果需要满足布局要求,数组将被隐式复制;如果您更愿意拒绝这样的论点(以避免沉默的低效率),您必须自己检查数组flags


推荐阅读