Eigen运行时错误"data is not scalar-aligned"(MSVC编译)求助
Eigen对齐断言错误问题排查与修复
问题描述
学习Eigen时执行以下任务触发断言错误:
- 生成10个用齐次坐标表示的随机2D向量
- 应用旋转+平移变换
- 执行逆变换
执行逆变换步骤时出现错误:
Assertion failed: (std::uintptr_t(m_data) % alignof(Scalar) == 0) && "data is not scalar-aligned"
即使将报错循环代码替换为points_transformed_inv[i] = T * points[i];,错误依然存在。
使用代码如下:
// gen random points std::vector<Eigen::Vector3d> points(10); for (auto& p: points) { p = Eigen::Vector3d::Random() * 10; p(2) = 1; } // 2d transform matrix Eigen::Matrix3d T; T << 0.8660254037844386, -0.5, 5, 0.5, 0.8660254037844386, -3, 0, 0, 1; // apply trasform std::vector<Eigen::Vector3d> points_transformed(10); for (int i = 0; i < 10; i++){ points_transformed[i] = T * points[i]; } // apply inverse transform std::vector<Eigen::Vector3d> points_transformed_inv(10); for (int i = 0; i < 10; i++) { // >> ERROR HERE: Assertion failed: (std::uintptr_t(m_data) % alignof(Scalar) == 0) && "data is not scalar-aligned" points_transformed_inv[i] = T.inverse() * points_transformed[i]; }
构建环境:MSVC 19.34.31942 + CMake 3.22(Debug配置),Eigen版本3.4.0。
问题原因
Eigen的Vector3d这类固定大小向量类型,为支持SIMD优化,要求内存按特定规则对齐(double类型通常需16字节对齐)。但std::vector默认分配器在MSVC Debug模式下,会添加额外调试信息,导致分配的内存起始地址无法满足Eigen的对齐要求,触发对齐断言检查。
修复方法
方法1:使用Eigen对齐分配器(推荐)
将std::vector的默认分配器替换为Eigen提供的aligned_allocator,确保内存分配符合对齐要求:
// 修改所有std::vector声明为: std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d>> points(10); std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d>> points_transformed(10); std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d>> points_transformed_inv(10);
方法2:临时禁用对齐断言(仅调试用)
在包含Eigen头文件前定义宏,关闭对齐检查,但会丢失SIMD优化能力,不推荐长期使用:
#define EIGEN_DONT_ASSERT_ALIGNED #include <Eigen/Dense>
内容的提问来源于stack exchange,提问作者Null Null
相关产品推荐
相关产品推荐

