【问题标题】:Cast integral array to class array将整数数组转换为类数组
【发布时间】:2015-06-03 20:44:19
【问题描述】:

我正在使用一个库向我传递一个指向int32_T 数组的指针。我需要对这些数字做一些数学运算,但数据实际上是Q23.8 格式。

我创建了一个重载基本数学运算符的类,但我不知道如何将int32_t 数组指针转换为我的新类——数据类型的大小不同。有没有办法强制我的新班级与int32_t 的大小相匹配,或者有其他方法可以完成这项工作吗?

注意:我想避免复制这个大数组的每个项目,因为我正在为资源受限的系统进行开发。

【问题讨论】:

  • 在你的类中有一个采用 int32_t 的构造函数。然后,您可以将数组的单个元素强制转换为您的类以便对其进行操作。

标签: c++ operator-overloading


【解决方案1】:

首先,请注意,如果您不受性能的限制,仅受内存消耗的限制,那么@Aumnayan 建议的解决方案可能更适合简单性和可移植性。

为了强制您的对象匹配int32_t 的大小和 Q23.8 的对齐方式,您可以使用位域:

struct Q_23_8
{
    int32_t fractional :  8;
    int32_t integral   : 23;
};

static_assert(sizeof(Q_23_8) == sizeof(int32_t), "Sizes differ!");

请注意,字段的顺序取决于目标 CPU 字节序;该示例适用于小端。此外,为了确保类的大小,您可能需要使用编译器的打包和对齐控制功能(例如 #pragma pack)。

拥有int32_t encoded[],您可以将其解释为Q_23_8 的数组,如下所示:

Q_23_8* decoded = reinterpret_cast<Q_23_8*>(encoded);

这是一个完整的代码示例:http://ideone.com/X177fQ。我强烈建议reading more about bit-fields,它们的可移植性和局限性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多