Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含另一个实例的特征实例,该实例包含一个固定大小的特征对象_C++_Eigen_Eigen3 - Fatal编程技术网

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

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

我刚读了艾根的网页。后者规定如下:

如果定义的结构具有固定大小的可向量化特征类型的成员,则必须重载其“运算符new”,以便生成16字节对齐的指针。幸运的是,Eigen为您提供了一个宏Eigen_MAKE_ALIGNED_OPERATOR_NEW,可以为您实现这一点

但是,我不清楚是否应该对包含其他类实例的类实例使用
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
运算符,则根本不需要宏。