ストレージ レイアウトが論理設計と正確に一致する必要があることを考えると、ディスク上のデータ構造を操作する最善の方法を知りたいです。ストレージに特定のレイアウトが必要な場合、構造の配置とパッキングはあまり役に立たないことがわかりました.
この問題に対する私のアプローチは、プロセッサ ディレクティブを使用して構造の (幅) を定義し、論理構造モデルに従うデータを追加した後にディスクに書き込む文字 (バイト) 配列を割り当てるときに幅を使用することです。
例えば:
typedef struct __attribute__((packed, aligned(1))) foo {
uint64_t some_stuff;
uint8_t flag;
} foo;
ディスク上で foo を永続化すると、「フラグ」値がデータの最後に来ます。&foo 型で fread を使用してデータを読み取るときに foo を簡単に使用できることを考えると、さらにバイトをいじることなく、通常どおり構造体を使用できます。
代わりに、私はこれを行うことを好みます
#define foo_width sizeof(uint64_t)+sizeof(uint8_t)
uint8_t *foo = calloc(1, foo_width);
foo[0] = flag_value;
memcpy(foo+1, encode_int64(some_value), sizeof(uint64_t));
次に、fwrite と fread を使用してバイトをコミットして読み取りますが、後でそれらをアンパックして、さまざまな論理フィールドに格納されたデータを使用します。
ディスク上のストレージのレイアウトを論理レイアウトと一致させたい場合、どのアプローチを使用するのが最適なのだろうか...これは単なる例です...
バイトのデコード/アンパックとディスク上の表現から構造を直接コピーすることに関して、各方法がどれほど効率的かを誰かが知っている場合は、共有してください。このアプローチでは、データ内のさまざまな境界までバイトをアンパック/トラバースするために多くのループ ロジックが必要になるため、パフォーマンスを犠牲にする必要があります。
ありがとう。