与特征数据类型并集
union with eigen data types
我一直在测试特征库数据类型,并带有类型双关语的联合。我的目的是拥有一个双数组的单个内存,可以作为特征数据类型访问,反之亦然。
例:
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); }
};
相关文章:
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何计算数据类型的范围,例如int
- C++中数据类型修饰符的顺序
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 特定数据类型的模板类
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 根据C++标准的定义实现"is_similar"类型特征
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何获取C++字符数据类型的地址
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 与特征数据类型并集
- 如何初始化具有类型特征的类模板的静态数据成员
- 为基本数据类型和特征数据类型编写模板函数
- OpenCV数据类型的类型特征