用于制造可变尺寸结构的方法(Method for making a variable size st

2019-10-16 14:38发布

我需要手艺具有报头,报尾以及可变长度有效载荷字段的分组。 到目前为止,我已经用了,所以我的结构设置这样的有效载荷向量:

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

当我尝试访问的载体,我得到的成员赛格故障和整个结构的的sizeof给我32(后我已经增加了大约100元的向量。

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

我发现这个职位大小可变的结构C ++他用一个字符数组,而我使用的是矢量虽然。

Answer 1:

在其他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


Answer 2:

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

通常,当人们想使大小可变的结构,它们通过增加一个阵列作为该结构的最后一个成员,并设置它的长度为1。然后,他们将分配额外的内存实际已通过的sizeof所需的结构()这样做以“扩大”的结构。 这几乎总是伴随着在struct详述扩展阵列的大小的额外构件。

之所以使用1对雷蒙德的博客彻底的记录

  • http://blogs.msdn.com/oldnewthing/archive/2004/08/26/220873.aspx


Answer 3:

我看到这个boost..it执行看起来很整洁......有一个可变长度的有效载荷....

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

这可能是完全未涉及到的问题,但我想分享的信息



文章来源: Method for making a variable size struct