提升::p ython 和特征/密集创建分割错误

Boost::python and Eigen/dense create a segmentation fault

本文关键字:创建 错误 分割 特征 ython 提升      更新时间:2023-10-16

我想在这样的结构中使用特征/密集对象:

#include <boost/python.hpp>
#include <Eigen/Dense>
#include <iostream>
#include <vector>
struct data_t {
Eigen::Matrix2f matrix;
//std::vector<float> matrix;
};
data_t init_data() {
data_t result;
result.matrix(0, 0) = 1.0f;
result.matrix(0, 1) = 2.0f;
result.matrix(1, 0) = 3.0f;
result.matrix(1, 1) = 4.0f;
//result.matrix.push_back(1.0f);
//result.matrix.push_back(2.0f);
//result.matrix.push_back(3.0f);
//result.matrix.push_back(4.0f);
return result;
}

BOOST_PYTHON_MODULE(python_test) {
boost::python::class_<data_t>("DataType")
.def("from_init", &init_data)
.staticmethod("from_init")
;
}

python代码看起来像:

import python_test
def init_data():
return python_test.DataType.from_init()
sample = init_data()

执行会导致分段错误。我的问题是:为什么?如果我用 std::vector 替换 Eigen 对象,代码运行良好。

问题是data_t包含一个 Eigen 期望对齐的矩阵,但 Boost::P ython 无法在对齐的内存上分配该矩阵。

最简单的解决方法是仅对此禁用对齐(如果您更频繁地使用它,请创建一个 typedef(:

struct data_t {
Eigen::Matrix<float, 2, 2, Eigen::DontAlign> matrix;
};

或者,通过编译-D EIGEN_MAX_STATIC_ALIGN_BYTES=0(在最近的特征版本上(或-D EIGEN_DONT_ALIGN_STATICALLY来禁用静态对齐(在较旧的特征版本中(。

实际上,如果 Boost::P ython 使用operator::new来分配其对象,则以下内容也可能有效:

struct data_t {
Eigen::Matrix2f matrix;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};