与特征数据类型合并

时间:2018-12-29 00:08:37

标签: c++ eigen unions

我一直在用联合测试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功能,但是在这些情况下我有什么办法可以使用类型修剪吗?我要达到的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

默认情况下,Eigen::Vector4d是16字节对齐的(或使用AVX编译时是32字节对齐的,更确切地说,它将与EIGEN_MAX_STATIC_ALIGN_BYTES对齐)。 这意味着在3个向量各自为3 * 8字节(= 72字节)之后,将有8个填充字节。您可以通过将最对齐的元素放在开头或locally disabling alignment来解决此问题。

由于在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); }

};

相关问题