0

ヘッダー、トレーラー、および可変長のペイロード フィールドを持つパケットを作成する必要があります。これまでのところ、ペイロードにベクトルを使用しているため、構造体は次のように設定されています。

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

ベクターのメンバーにアクセスしようとすると、セグ フォールトが発生し、構造体全体の sizeof が 32 になります (ベクターに約 100 の要素を追加した後)。

これは良いアプローチですか?何が良いですか?

この投稿を見つけました Variable Sized Struct C++ 彼は char 配列を使用していましたが、私はベクトルを使用しています。

4

3 に答える 3

5

ベクター型は構造体でインライン化されていますが、ベクター内にある唯一のメンバーはポインターである可能性があります。ベクターにメンバーを追加しても、ベクター型自体のサイズは増加しませんが、それが指すメモリは増加します。そのため、構造体のサイズがメモリ内で増加することはなく、セグ フォールトが発生します。

通常、可変サイズの構造体を作成したい場合、構造体の最後のメンバーとして配列を追加し、その長さを 1 に設定します。その後、実際に sizeof() で必要とされる構造体に余分なメモリを割り当てます。構造を「拡張」するために。これには、ほとんどの場合、展開された配列のサイズを詳述する構造体の追加メンバーが伴います。

1 を使用する理由は、Raymond のブログに完全に記載されています。

于 2009-06-19T13:42:16.290 に答える
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
于 2009-06-19T13:50:21.483 に答える
1

ブーストでこの実装を見ました..可変長のペイロードを持つのは本当にきれいに見えます....

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

これは質問とはまったく関係ないかもしれませんが、情報を共有したかったのです

于 2009-06-19T17:46:36.427 に答える