联合特征数据类型

union with eigen data types

我一直在测试 Eigen 库数据类型与类型双关联合。我的意图是拥有一个双数组的内存,可以作为特征数据类型访问,反之亦然。

示例:

union BigBox{
    double X[13];
    struct
    {
        Eigen::Vector3d p;
        Eigen::Vector3d v;
        Eigen::Vector3d w;
        Eigen::Vector4d q;
    } data;

};

当我测试

sizeof(BigBox)/sizeof(double) = 14
sizeof(Eigen::Vector3d)/sizeof(double) = 3
sizeof(Eigen::Vector4d)/sizeof(double) = 4

结构的大小不相加。如何分配额外的+1?我相信这可能是因为编译器试图利用 SMID 功能,但在这些情况下我有什么办法可以使用类型双关吗?我想要实现的目标的正确方法是什么?

默认情况下,Eigen::Vector4d 是 16 字节对齐的(或者当使用 AVX 编译时是 32 字节对齐的,更准确地说它将对齐到 EIGEN_MAX_STATIC_ALIGN_BYTES)。 这意味着在每个 3*8 字节(=72 字节)的 3 个向量之后,将有 8 个填充字节。您可以通过将最对齐的元素放在开头或 locally disabling alignment.

来解决它

None 这真的很安全,因为在 C++ 联合中 should not be used for type-punning——尽管它在实践中经常有效。

为了安全起见,你可以这样做:

struct BigBox{
    Eigen::Matrix<double,13,1> X;

    Eigen::Ref<Eigen::Vector3d      > p()       { return X.segment<3>(0); }
    Eigen::Ref<Eigen::Vector3d const> p() const { return X.segment<3>(0); }
    Eigen::Ref<Eigen::Vector3d      > v()       { return X.segment<3>(3); }
    Eigen::Ref<Eigen::Vector3d const> v() const { return X.segment<3>(3); }
    Eigen::Ref<Eigen::Vector3d      > w()       { return X.segment<3>(6); }
    Eigen::Ref<Eigen::Vector3d const> w() const { return X.segment<3>(6); }
    Eigen::Ref<Eigen::Vector4d      > q()       { return X.segment<4>(9); }
    Eigen::Ref<Eigen::Vector4d const> q() const { return X.segment<4>(9); }

};