【发布时间】:2018-08-22 08:20:40
【问题描述】:
我正在尝试对几个结构使用联合,特别是将 2D(4 x 4)浮点数组与 4 个 Vector4 对齐。
据我了解,union 从第一个开始查看顺序字节。如果我有一个 4x4 数组并且想要获得一整列,我需要跳过 16 个字节才能到达下一行。
例子:
Matrix = {{a, b, c, d},
{e, f, g, h},
{h, i, j, k},
{l, m, n, o};
如果给出的数据使得一维数组为{a,b,c,d,e,..., o},我将如何获得最后一列 (d,h,k,o)?
那么我将如何获得字节:12->16、28->32、44->48、60->64?
返回最后一行的代码(不是我想要的)是:
//matrix.h
struct Matrix4 {
union{
float values[4][4];
Vector4 column[4];
};
//matrix methods etc
}
//main.cpp
Matrix4 position = Matrix3::translation(Vector3(1,2,3));
Vector4 column = position.column[2];
std::cout << (column) << std::endl;
输出矩阵将是(不记得如何使用 LaTex 格式对不起):
| 1 0 0 1 |
| 0 1 0 2 |
| 0 0 1 3 |
| 0 0 0 1 |
所以我想要的专栏是:
|1|
|2|
|3|
|1|
工会给出:
|0|
|0|
|0|
|1|
(最后一行,不是列)。
将我的代码重构为使用一维数组来获取顺序字节会更容易,还是应该更改矩阵的构造方式?或者我可以在联合中处理其他事情吗?
编辑:我的问题与other question 不同,因为我已经创建了一个矩阵类并分配了内存。我的问题着眼于“联合”的功能及其限制,以及使用我定义的结构 'Vector4' 作为在矩阵中表示某些数据的一种方式。我正在研究跳过字节以接收不直接相互跟随的数据的可能性,而不是如何分配所述字节。
【问题讨论】:
-
联合在任何时候只保留其中一个值。如果您想对同一内存进行 1d 和 2d 访问,请使用
std::vector并写入at(index)和at(row,col)访问器 -
不要在 C++ 中使用 union 来给不同类型起别名,这是未定义的行为。
-
C++ Matrix Class的可能重复
-
未定义行为:en.cppreference.com/w/cpp/language/ub union 是错误的工具,union 用于存储其中一个数据成员,而不是同时存储两个成员,也不使用另一个成员访问一个成员的数据。
-
使用自定义iterators 来遍历列对于很多情况来说是一个很好的解决方案。
标签: c++ arrays multidimensional-array unions