实现一个指向可变大小结构的指针
implement a pointer to a variable sized structure
我试图解析返回的信息,可以在一个结构中有一个可变的数据量。我不确定如何有效地做到这一点,我写了一个类,包含每个变量作为一个函数,该函数通过计算适当的偏移量返回数据,但它不是很好管理,必须有一个更好的方法。我读过关于向量(没有太多的经验),但当我将它们添加到一个结构时,它会添加额外的填充,从而将所有变量移过来。
例如: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"在语法上支持这种特性。
- 如何在 C# 中映射双 C 结构指针?
- C++:映射结构中的结构指针
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 类的静态结构指针声明在C++
- 在两个.cpp文件之间定义全局类/结构指针
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 是否可以将无符号字符数组reinterpret_cast到仅包含C++中无符号字符成员的结构指针
- 如何在地图中使用结构指针
- 结构指针在"新"调用上给出已分配的地址?
- 铸造结构指针指向C 的工会指针
- c++ 结构指针在初始化为 NULL 时无法读取内存
- 函数中的结构指针的地址为0x1
- C 用结构指针初始化结构
- C 结构指针铸成数组Interop C#
- 方法中不允许访问结构指针
- 如何打印出结构指针
- MPI_Op_create:候选功能不可行.自定义结构指针不能解释为空指针
- 尝试将结构指针传递给类时出错
- 初始化结构指针的值
- 使用 pybind11 将自定义结构(指针向量)从 C++ 传递到 python 的方法是什么?