最近,我意识到固定大小可矢量化特征对象的内存对齐的潜在问题。
文档中所述的正确代码:
class Foo
{
...
Eigen::Vector2d v;
...
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
...
Foo *foo = new Foo;
我想知道这个代码是否可以?
class Foo2
{
...
Foo foo;
...
};
...
Foo2 *foo = new Foo2; //?
或者应该在 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
类中再次添加
Foo2
吗? 这就是here的建议,我认为:
如果我们添加 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 这只能解决 Cartographer 库本身的问题。该库的用户还必须将 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 添加到包含矢量化 Cartographer 类的类中。这听起来像是一场维护噩梦。我没有新运算符重载的经验。我认为这个问题更普遍,并且在某种程度上与 new 运算符在 C++ 中的工作方式有关。例如,
Foo
中的重载new运算符是否会被
Foo2
中的默认new运算符调用?那么继承呢?如果
Foo2
继承自
Foo
,我们是否应该将
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
也放入
Foo2
中?
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
也可以(如果仅启用 SSE)
-march=native
的 AVX2 以在本地计算机上进行所有优化),否则现在需要
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
并且启用了 NEON,会出现什么问题吗?
template <typename Scalar> using Isometry3 = Eigen::Transform<Scalar, 3, Eigen::Isometry | Eigen::DontAlign>
而不是
Isometry
Isometry3d
)而不会出现对齐问题。那么添加一个继承自
MyIsometry3d
的新类型
Eigen::Transform<double, 3, Eigen::Isometry | Eigen::DontAlign>
吗?
Isometry3d
Isometry3d
或使用
std::vector<Isometry3d>
时,不必担心对齐问题
_loadu_
/
_storeu_
,其他架构怎么样,是否有等效的?)?
#define EIGEN_UNALIGNED_VECTORIZE 0
,这是正确的吗?所以我必须在任何
#define
包含之前把这个
Eigen/Dense
放在任何地方?
Matrix<double,2,2,DontAlign>
或新类之类的东西替换所有地方
固定大小可矢量化特征对象页面,我认为缺少某些类型。对于我正在使用的类型:
Eigen::Isometry3d
、
Eigen::Isometry3f
?
Eigen::AngleAxisd
、
Eigen::AngleAxisf
?
Foo2
因此也需要宏。更新:实际上这似乎是不正确的,因为
operator new
是从基类继承的。