联合特征数据类型
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); }
};
我一直在测试 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); }
};