代码之家  ›  专栏  ›  技术社区  ›  bergercookie Seivan

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

  •  0
  • bergercookie Seivan  · 技术社区  · 6 年前

    我刚刚读了 Structures having static members 特征页面。后者规定如下:

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

    然而,我不清楚我们是否也应该使用 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 用于保存其他类实例的类实例的宏,而这些类实例又保存固定大小的容器?

    例如,在下面代码段的类A中,是否需要EIGEN\u MAKE\u ALIGNED\u OPERATOR\u 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;
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   chtz    6 年前

    在你的情况下,两者都需要 A B . 如果 A. 将继承自 B 它还将继承 new 运算符(因此无需再次写入)。此外,如果 B 它本身永远不会被直接分配,而是作为 A. ,您需要 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 仅在中 A. .

    此外,如果您为x86\u 64体系结构编译,您的程序也很可能正常工作,因为大多数编译器总是将 ,另一方面,只是添加 EIGEN\u MAKE\u ALIGNED\u OPERATOR\u NEW everywhere几乎不会对性能产生影响(除非过度(取消)分配对象)。