将整数数组转换为 class 数组
Cast integral array to class array
我正在使用一个库,向我传递一个指向 int32_T
数组的指针。我需要对这些数字做一些数学运算,但数据实际上是 Q23.8 格式。
我创建了一个 class 重载基本数学运算符,但我仍然不知道如何将 int32_t
数组指针转换为我的新 class -- 数据类型不同尺寸。有没有办法强制我的新 class 匹配 int32_t
的大小,或者是否有其他方法可以完成此操作?
注意:我想避免复制这个大数组的每一项,因为我正在为资源受限的系统开发。
首先,请注意,如果您不受性能的限制,仅受内存消耗的限制,@Aumnayan 建议的解决方案可能更适合简单性和可移植性。
为了强制您的对象匹配 Q23.8 的大小 int32_t
和对齐方式,您可以使用位域:
struct Q_23_8
{
int32_t fractional : 8;
int32_t integral : 23;
};
static_assert(sizeof(Q_23_8) == sizeof(int32_t), "Sizes differ!");
请注意,字段的顺序取决于目标 CPU 字节序;该示例适用于小端。此外,为了确保 class 的大小,您可能需要使用编译器的打包和对齐控制功能(例如 #pragma pack
)。
有 int32_t encoded[]
你可以将其解释为 Q_23_8
的数组,如下所示:
Q_23_8* decoded = reinterpret_cast<Q_23_8*>(encoded);
这是一个完整的代码示例:http://ideone.com/X177fQ. I strongly suggest reading more about bit-fields、它们的可移植性和局限性。
我正在使用一个库,向我传递一个指向 int32_T
数组的指针。我需要对这些数字做一些数学运算,但数据实际上是 Q23.8 格式。
我创建了一个 class 重载基本数学运算符,但我仍然不知道如何将 int32_t
数组指针转换为我的新 class -- 数据类型不同尺寸。有没有办法强制我的新 class 匹配 int32_t
的大小,或者是否有其他方法可以完成此操作?
注意:我想避免复制这个大数组的每一项,因为我正在为资源受限的系统开发。
首先,请注意,如果您不受性能的限制,仅受内存消耗的限制,@Aumnayan 建议的解决方案可能更适合简单性和可移植性。
为了强制您的对象匹配 Q23.8 的大小 int32_t
和对齐方式,您可以使用位域:
struct Q_23_8
{
int32_t fractional : 8;
int32_t integral : 23;
};
static_assert(sizeof(Q_23_8) == sizeof(int32_t), "Sizes differ!");
请注意,字段的顺序取决于目标 CPU 字节序;该示例适用于小端。此外,为了确保 class 的大小,您可能需要使用编译器的打包和对齐控制功能(例如 #pragma pack
)。
有 int32_t encoded[]
你可以将其解释为 Q_23_8
的数组,如下所示:
Q_23_8* decoded = reinterpret_cast<Q_23_8*>(encoded);
这是一个完整的代码示例:http://ideone.com/X177fQ. I strongly suggest reading more about bit-fields、它们的可移植性和局限性。