将程序移至 32 位系统时出现问题
class Example{
Eigen::Vector2d test
}
typedef boost::shared_ptr<Example> ExamplePtr;
我得到了那里描述的错误
解决方案是:
class Example{
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Eigen::Vector2d test
}
typedef boost::shared_ptr<Example> ExamplePtr;
但这个解决方案仍然不起作用,我不知道。该程序是在 64 位 Linux 上编程的,现在我想在 32 位 Windows 上导入它。
你有什么想法我可以尝试做吗?
有错误信息说明:
my_program: path/to/eigen/Eigen/src/Core/DenseStorage.h:44: Eigen::internal::matrix_array::internal::matrix_array() [with T = double, int Size = 2, int MatrixOptions = 2 , bool Align = true]: Assertion `(reinterpret_cast(array) & 0xf) == 0 && "这里解释了这个断言:http ://eigen.tuxfamily.org/dox/UnalignedArrayAssert.html 阅读这个网页!!! ****“' 失败的。
我的错误信息:
我尝试主要
int main(){
ExamplePtr ptr=ExamplePtr(new Example());
}
在 64 位系统上这是有效的
编辑:
需要更改什么样的代码?
需要更改的代码是这样的:
class Foo
{
...
Eigen::Vector2d v;
...
};
...
Foo *foo = new Foo;
换句话说:你有一个类,它有一个固定大小的可矢量化 Eigen 对象作为成员,然后你动态地创建该类的一个对象。应该如何修改这样的代码?
很简单,你只需要将 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 宏放在类的公共部分,如下所示:
class Foo
{
...
Eigen::Vector2d v;
...
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
...
Foo *foo = new Foo;
这个宏使“new Foo”总是返回一个对齐的指针。
如果这种方法过于侵入,另请参阅其他解决方案。
这是成员变量的解决方案。