gpt4 book ai didi

c++ - Eigen + Boost 共享 Ptr 和 32 位

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:38 24 4
gpt4 key购买 nike

将我的程序移动到 32 位系统时遇到问题

class Example{
Eigen::Vector2d test
}
typedef boost::shared_ptr<Example> ExamplePtr;

我得到了那里描述的错误

Eigen

解决方案是:

class Example{
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Eigen::Vector2d test
}
typedef boost::shared_ptr<Example> ExamplePtr;

但这个解决方案仍然无效,我不知道。该程序是在 Linux 64 位上编写的,现在我想将它导入到 Windows 32 位上。

你有什么想法我可以尝试和做什么吗?


出现错误信息说明:

我的程序:路径/to/eigen/Eigen/src/Core/DenseStorage.h:44: Eigen::内部::矩阵_数组::内部::矩阵_数组()[使用 T = double,int Size = 2,int MatrixOptions = 2,bool Align = true]:断言`(reinterpret_cast(array) & 0xf) == 0 && "这个断言在这里解释:http://eigen.tuxfamily.org/dox/UnalignedArrayAssert.html 阅读此网页! ****"' 失败。

我的错误信息: Error

我在主界面尝试

int main(){
ExamplePtr ptr=ExamplePtr(new Example());
}

在 64 位系统上这是有效的

编辑:

需要修改什么样的代码?

需要改的代码是这样的:

class Foo
{
...
Eigen::Vector2d v;
...
};
...
Foo *foo = new Foo;

换句话说:您有一个类,该类的成员是一个固定大小的可向量化 Eigen 对象,然后动态创建该类的一个对象。这样的代码应该如何修改?

非常简单,您只需要在类的公共(public)部分放置一个 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 宏,如下所示:

class Foo
{
...
Eigen::Vector2d v;
...
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
...
Foo *foo = new Foo;

这个宏使得“new Foo”总是返回一个对齐的指针。

如果此方法太麻烦,另请参阅其他解决方案。

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

最佳答案

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

typedef Eigen::Matrix<double,2,1,Eigen::DontAlign> Vector2du;
class Example{
Eigen::Vector2du test;
}

关于c++ - Eigen + Boost 共享 Ptr 和 32 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18375528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com