制作可变大小结构的方法

时间:2009-06-19 13:39:39

标签: c++ data-structures packets

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

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

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

这是一个好方法吗?什么更好?

我找到了这篇文章 Variable Sized Struct C++ 他正在使用char数组,但我正在使用矢量。

3 个答案:

答案 0 :(得分:5)

尽管向量类型在结构中内联,但向量中唯一的成员可能是指针。向向量添加成员不会增加向量类型本身的大小,而是增加它指向的内存。这就是为什么你永远不会看到结构的大小增加内存,因此你得到一个seg错误。

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

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

答案 1 :(得分:2)

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

你做得很好。要避免seg错误,请像访问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

答案 2 :(得分:1)

我在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; }  //
};

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