实现一个指向可变大小结构的指针

implement a pointer to a variable sized structure

本文关键字:结构 指针 一个 实现      更新时间:2023-10-16

我试图解析返回的信息,可以在一个结构中有一个可变的数据量。我不确定如何有效地做到这一点,我写了一个类,包含每个变量作为一个函数,该函数通过计算适当的偏移量返回数据,但它不是很好管理,必须有一个更好的方法。我读过关于向量(没有太多的经验),但当我将它们添加到一个结构时,它会添加额外的填充,从而将所有变量移过来。

例如:

struct info_t {
   UINT32 signature;
   UINT32 elements[NUM_ELEMENTS];
   UINT32 options;
};

NUM_ELEMENTS是动态生成的,只有在运行时才知道,elements变量的大小必须恰好是NUM_ELEMENTS,否则options变量的偏移量就会错误。

如果我能在需要的时候初始化结构指针,我很高兴,但是c++不会让我在编译过程中拥有一个未知的NUM_ELEMENTS变量。什么好主意吗?谢谢。

c++标准不支持VLA
c++提供 std::向量

通常,您将可变长度值放在末尾,然后将其作为数组拉出并将其分配到vector中,例如。c++中通常不使用这种代码

尝试编写一个包装器类,它接受数据并提供成员函数以一种干净的方式访问数据,然后看看它有多快。它可能已经够快了。

我假设info_t是您试图解析的数据格式,因此您不能更改它。

使用包装器类无法管理是否有什么特别的原因?这似乎正是OOP有用的地方。如果你不想要一个接口与info_t兼容的类,你可以使用以下布局:

struct info_t {
   UINT32 &signature;
   UINT32 * const elements;
   UINT32 &options;
};

你必须创建一个构造函数,将字段设置为指向输入数据中的正确位置。

如果你的输入数据是一个指向uint32类型数组的指针,构造函数可能看起来像这样:

info_t(UINT32 *data, size_t number_of_elements) :
    signature (*data),
    elements (data+1),
    options (*(data+number_of_elements+1)) {}

如果您想在info_t实例超出作用域时释放data,您可以在构造函数中这样做。

一张图片(代码)胜过千言万语:

// --> do not instantiate a static variable of these:
struct info_t_headerstruct {
   UINT32 signature;
   UINT32 options;
   UINT32 num_elements;
   // no elements !!!
};
// --> do not instantiate a static variable of these, either:
// header plus variable elements
struct info_t_struct {
   info_t_headerstruct header;
   UINT32 elements[65535]; 
};
// --> you will use this type instead:
typedef
  info_t_struct* info_t_ptr;
info_t_ptr generate(size_t variableqty)
{
  size_t HowManyBytes = (sizeof(info_t_headerstruct) + (sizeof UINT32  * variableqty));
  info_t_ptr Result = malloc(HowManyBytes);
}
// ...
void doSomething(info_t_ptr dataptr)
{
  dataptr = generate(5);
  // ...
}

这是一种情况,你可能想摆脱"一切都是类/对象"的想法。我通常在c++中使用与"普通C"相同的"struct",作为数据而不是类/对象。

在前面的回答中提到过。您应该将元素或变量数据移动到数据类型的页脚。

您还必须添加一个存储物品数量的字段。类型声明的数量非常大。,但是,永远不要让它成为一个真正的变量。

您将使用结构体的指针,而不是结构体本身。

一些[大学项目/公司]的非标准版本的"pascal"或"plain C"在语法上支持这种特性。