包含另一个包含固定大小特征对象的实例的特征实例

问题描述 投票:0回答:1

我刚读过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;
}
c++ eigen eigen3
1个回答
2
投票

在你的情况下,AB都需要它。如果A将从B继承,它也将继承new运算符(因此不必再次写入)。此外,如果B本身永远不会被直接分配,但作为A的一部分,你只需要在EIGEN_MAKE_ALIGNED_OPERATOR_NEW中使用A

此外,如果您编译x86_64架构,您的程序也很可能会工作,因为大多数编译器将总是16字节 - 对齐new的结果,另一方面,只需在任何地方添加EIGEN_MAKE_ALIGNED_OPERATOR_NEW几乎不会产生性能影响(除非您过度( de-)分配对象)。

© www.soinside.com 2019 - 2024. All rights reserved.