我刚刚阅读了Structures having static members特征页面。后者规定如下:


  如果定义的结构具有固定大小的可矢量化Eigen类型成员,则必须重载其“ operator new”,以便它生成16字节对齐的指针。幸运的是,Eigen为您提供了一个宏EIGEN_MAKE_ALIGNED_OPERATOR_NEW来为您执行此操作。


但是对我来说尚不清楚,对于包含其他类实例的类实例,我们是否还应该对其他实例使用EIGEN_MAKE_ALIGNED_OPERATOR_NEW宏,这些类实例又又容纳固定大小的容器?

例如,在以下代码段的A类中,是否需要EIGEN_MAKE_ALIGNED_OPERATOR_NEW?

#include <Eigen/Core>

class B
{
public:
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
  Eigen::Vector2d v;
};

class A
{
public:
  B b;
};


int main(int argc, char *argv[])
{
  B* b = new B(); // this should have no alignement problems as we use EIGEN_MAKE_ALIGNED_OPERATOR_NEW
  A* a = new A(); // how about this one?

  return 0;
}

最佳答案

您的情况AB都需要。如果A将从B继承,它也将继承new运算符(因此不必再次编写)。另外,如果B本身永远不会直接分配,而只是作为A的一部分,则仅在EIGEN_MAKE_ALIGNED_OPERATOR_NEW中需要A

另外,如果您针对x86_64架构进行编译,则程序也很有可能会工作,因为大多数编译器始终将new的结果与16byte-align对齐,另一方面,仅在各处添加EIGEN_MAKE_ALIGNED_OPERATOR_NEW几乎不会对性能产生影响(除非您过度(取消)分配对象)。

10-08 08:23
查看更多