我刚读过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;
}
在你的情况下,A
和B
都需要它。如果A
将从B
继承,它也将继承new
运算符(因此不必再次写入)。此外,如果B
本身永远不会被直接分配,但作为A
的一部分,你只需要在EIGEN_MAKE_ALIGNED_OPERATOR_NEW
中使用A
。
此外,如果您编译x86_64架构,您的程序也很可能会工作,因为大多数编译器将总是16字节 - 对齐new
的结果,另一方面,只需在任何地方添加EIGEN_MAKE_ALIGNED_OPERATOR_NEW
几乎不会产生性能影响(除非您过度( de-)分配对象)。