2

将程序移至 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”总是返回一个对齐的指针。

如果这种方法过于侵入,另请参阅其他解决方案。

这是成员变量的解决方案。

4

2 回答 2

1

我想问题是 boost::shared_ptr 没有使用 operator new 进行内存分配。我建议您对成员变量使用非对齐的 2D 向量类型:

typedef Eigen::Matrix<double,2,1,Eigen::DontAlign> Vector2du;
class Example{
  Eigen::Vector2du test;
}
于 2013-08-22T12:04:26.643 回答
0

我相信你在你的项目中有错误的包装。请把#pragma pack(show)你的类声明放在上面并编译。如果它显示不等于 8,请输入以下代码:

#pragma pack(push, 8)
...
#pragma pack(pop)

到处都是#include <eigen...>,可能是你的班级声明。

于 2013-08-22T10:19:15.540 回答