サイズも異なる多種多様な構造を保存する良い方法は?

c++ data-structures storage
サイズも異なる多種多様な構造を保存する良い方法は?

タイトルは少しわかりにくいので、例を使用してもう少し説明します。 ただ注意:私はファイル形式を解析しています。 次のような構造があるとします。

struct example
{
   typeA a;
   typeB b;
   typeX x;
   typeY y;
   typeZ z;
};

これまでのところ大丈夫です。 問題は、「typeX」、「typeY」、および「typeZ」のサイズが異なる可能性があることです。 ファイルヘッダー(メタデータ)のフラグに応じて、2バイトまたは4バイトのサイズにすることができます。 もう1つは、このような構造がさらにいくつかあることです(約40)。 それらはそれぞれ、「typeX」、「typeY」、「typeZ」を使用します。 それらのすべて、1つまたは2つだけ。 そして最後に、それらのほとんどはオプションであるため、使用される構造は4つまたは5つ、または20または30 …​

そのようなさまざまなデータのセットを保存する方法を誰かが考えているかどうかを知りたいです。 テンプレートの使用を考えましたが、正しい方法かどうかはわかりません。

編集:さらに明確にするために:メモリは大きな問題ではないので、おそらく少しのスペースを浪費する余裕があります。 typeXが4バイトの場合、すべての構造でそうです。 Hovewerは同期されないため、typeXは4バイト、typeZは2にすることができます。 ほとんどの構造は複数回使用される可能性があるため、50個のexample1構造、10個のexample2構造などがあります。

  2  0


ベストアンサー

私にとっての問題は、いくつかのスペースを割り当てることではなく、概念的にはこれを行うことができます:

byte *pA = new byte[the size this time];

むしろ、これらのtypeAオブジェクトで何をするかです。 なにが

pA->getValue()

戻る? 常に、32ビットの数値であるという意図ですか? それとも本当に

pA->get16bitValue()

場合によっては

pA->get32bitValue()

他の人に?

最初にその違いをカプセル化する方法を模索していますが、その方法は値の使用方法に大きく依存します。 ストレージの問題は、おそらく少しの動的割り当てで解決できます。 typeAの実際の動作は、トリッキーだと思います。

2


ファイルを解析しているため、言及していない1つの要因は、ソフトウェアがCPUに依存しないことを意図しているかどうかです。 一部のCPUはリトルエンディアンです。つまり、データのアイテムは最下位バイトが最初に格納され、最上位バイトが最後に格納されます。 他のCPUはビッグエンディアンで、バイト順は逆です。 ファイルを解析するときに、反対のエンディアンのCPUを使用してファイルが書き込まれた可能性がある場合、これを考慮する必要があります。 これを行うための堅牢な方法は、ファイル形式が必要とするエンディアンを定義し、一度に1バイトずつファイルを読み取り、適切なシフト演算子を使用してデータを構築することです。

intVal = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];

したがって、ファイルを構造体に直接読み込むことは、おそらく良い考えではないことがわかります。

実際にファイルをストリームとして扱い(これが何であるか)、ストリーム操作を定義して、一度に1項目ずつ内部メモリ構造にデータを転送する必要があります。

これを受け入れると、ファイル形式は内部メモリ構造から切り離されます。 その後、好きなようにデータを内部に保存できます。 あなたの場合、それはポリモーフィズムの理想的なアプリケーションのように聞こえます。 typeX / Y / Zの各バリアントに対してサブクラスを宣言できます。 または、単一のクラスを使用して、コンストラクターで可変量のメモリを割り当てることができます。 それはすべてあなたの状況に依存します。 重要なのは、ファイル形式を内部メモリ構造から切り離すことです。

1


タイトルとURLをコピーしました