【问题标题】:Method for making a variable size struct制作可变大小结构的方法
【发布时间】:2009-06-19 13:39:39
【问题描述】:

我需要制作一个包含标头、尾标和可变长度有效负载字段的数据包。到目前为止,我一直在使用向量作为有效载荷,所以我的结构是这样设置的:

struct a_struct{
 hdr a_hdr;
 vector<unsigned int> a_vector;
 tr a_tr;
};

当我尝试访问向量的成员时,我遇到了一个段错误,整个结构的 sizeof 给了我 32(在我向向量添加了大约 100 个元素之后。

这是一个好方法吗?什么比较好?

我找到了这篇文章 Variable Sized Struct C++ 他使用的是 char 数组,而我使用的是向量。

【问题讨论】:

  • 能否请您提供更多代码。您如何创建和访问您的结构等?
  • 您应该注意,您的数据包的内存不是连续的,因为您使用的是向量。因此,例如,如果您不自己序列化它,就无法对其进行 memcpy 或通过网络将其输出。

标签: c++ data-structures packets


【解决方案1】:

即使向量类型在结构中内联,向量中的唯一成员也可能是指针。向向量添加成员不会增加向量类型本身的大小,而是增加它指向的内存。这就是为什么您永远不会看到内存中结构的大小增加,因此您会遇到段错误。

通常当人们想要创建一个可变大小的结构时,他们会通过添加一个数组作为结构的最后一个成员并将其长度设置为 1。然后他们将为 sizeof 实际需要的结构分配额外的内存() 以“扩展”结构。这几乎总是伴随着结构中的一个额外成员,详细说明扩展数组的大小。

Raymond 的博客中详细记录了使用 1 的原因

【讨论】:

    【解决方案2】:

    另一个 SO 答案中的解决方案是 c 特定的,并且依赖于 c 数组的特性 - 即使在 c 中,sizeof() 也无法帮助您找到可变大小结构的“真实”大小。从本质上讲,它是一种作弊,它是一种在 C++ 中没有必要的作弊。

    你正在做的很好。为避免段错误,请像访问 C++ 中的任何其他向量一样访问该向量:

    a_struct a;
    for(int i = 0; i < 100; ++i) a.a_vector.push_back(i);
    cout << a.a_vector[22] << endl; // Prints 22
    

    【讨论】:

    • 请注意,这两个声明(c-struct 和 hier)是不同的。
    【解决方案3】:

    我在 boost 中看到了这个实现..它看起来真的很整洁...有一个变量 有效载荷长度......

    class msg_hdr_t 
    {
       public:
       std::size_t             len;     // Message length
       unsigned int            priority;// Message priority
       //!Returns the data buffer associated with this this message
       void * data(){ return this+1; }  //
    };
    

    这可能与问题完全无关,但我想分享信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多