C++ 包含另一个实例的特征实例,该实例包含一个固定大小的特征对象
我刚读了艾根的网页。后者规定如下: 如果定义的结构具有固定大小的可向量化特征类型的成员,则必须重载其“运算符new”,以便生成16字节对齐的指针。幸运的是,Eigen为您提供了一个宏Eigen_MAKE_ALIGNED_OPERATOR_NEW,可以为您实现这一点 但是,我不清楚是否应该对包含其他类实例的类实例使用C++ 包含另一个实例的特征实例,该实例包含一个固定大小的特征对象,c++,eigen,eigen3,C++,Eigen,Eigen3,我刚读了艾根的网页。后者规定如下: 如果定义的结构具有固定大小的可向量化特征类型的成员,则必须重载其“运算符new”,以便生成16字节对齐的指针。幸运的是,Eigen为您提供了一个宏Eigen_MAKE_ALIGNED_OPERATOR_NEW,可以为您实现这一点 但是,我不清楚是否应该对包含其他类实例的类实例使用EIGEN\u MAKE\u ALIGNED\u OPERATOR\u NEW宏,而这些类实例又包含固定大小的容器 例如,在下面代码段的类A中,是否需要特征值_MAKE_ALIGNED
EIGEN\u MAKE\u ALIGNED\u OPERATOR\u NEW
宏,而这些类实例又包含固定大小的容器
例如,在下面代码段的类A中,是否需要特征值_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;
}
#包括
B类
{
公众:
特征算子使对齐算子成为新算子;
本征::矢量2D v;
};
甲级
{
公众:
B B;
};
int main(int argc,char*argv[])
{
B*B=new B();//这应该没有对齐问题,因为我们使用特征值_MAKE_ALIGNED_OPERATOR_new
A*A=newa();//这个怎么样?
返回0;
}
在您的情况下,A
和B
都需要它。如果A
将从B
继承,则它也将继承新的
运算符(因此无需再次写入)。此外,如果B
本身永远不会被直接分配,而只是作为A
的一部分,则只在A
中需要特征值\u MAKE\u ALIGNED\u OPERATOR\u NEW
此外,如果您为x86_64体系结构编译,您的程序也很可能正常工作,因为大多数编译器总是将
new
的结果16字节对齐,另一方面,只需在任何地方添加EIGEN\u MAKE\u ALIGNED\u OPERATOR\u new
几乎不会对性能产生影响(除非您过度(取消)分配对象).在您的情况下,A
和B
都需要它。如果A
将从B
继承,则它也将继承新的
运算符(因此无需再次写入)。此外,如果B
本身永远不会被直接分配,而只是作为A
的一部分,则只在A
中需要特征值\u MAKE\u ALIGNED\u OPERATOR\u NEW
此外,如果您为x86_64体系结构编译,您的程序也很可能工作,因为大多数编译器总是将
new
的结果16字节对齐,另一方面,只需在任何地方添加EIGEN\u MAKE\u ALIGNED\u OPERATOR\u new
几乎不会对性能产生影响(除非您过度(取消)分配对象)。,听到这个消息很惊讶。我想这会是另一种方式,因为Egeng被广泛使用,而我在Egeng的这个用例中没有发现新的Egeng?MAKE?ALIGNED?OPERATOR?你说的“另一种方式”是什么意思?我想你也不需要在类A中添加Egeng?MAKE?ALIGNED?OPERATOR。好吧,你需要。除非,A
将继承自B
。如果一个对齐变量的成员资格足以获得一个对齐的新的操作符,那么就根本不需要宏了。哇,听到这个消息真让人惊讶。我想这会是另一种方式,因为Egeng被广泛使用,而我在Egeng的这个用例中没有发现新的Egeng?MAKE?ALIGNED?OPERATOR?你说的“另一种方式”是什么意思?我想你也不需要在类A中添加Egeng?MAKE?ALIGNED?OPERATOR。好吧,你需要。除非,A
将继承自B
。如果对齐变量的成员资格足以获得对齐的new
运算符,则根本不需要宏。