与特征数据类型并集

union with eigen data types

本文关键字:数据类型 特征      更新时间:2023-10-16

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

例:

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 个 3*8 字节的向量(=72 字节)之后,将有 8 个填充字节。您可以通过将最对齐的元素放在开头或通过本地禁用对齐来解决此问题。

这些都不是真正安全的,因为在C++中,联合不应该用于类型双关语 - 尽管它在实践中经常有效。

为了更安全一点,您可以执行以下操作:

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); }

};