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