構造体のアライメントを行う C 標準準拠の方法はありますか?
最大の要素を最初に置くことができることはわかっていますが、プロトコルを実装しようとしている状況にあります。
いいえ、一般的ではありません。
構造内の要素の順序を変更することは絶対にできません。宣言どおりの順序にする必要があります。
しかし、アラインメントに関して、将来のプロセッサが何を好むかを事前に知ることもできません。
プロトコル (「外部」表現) は、メモリ内の との間で直接コピーする必要はありません。struct
代わりに、各構造体メンバーを独自にシリアル化/逆シリアル化する必要があります。
C11 では、_Alignas
キーワードを使用してアラインメントを指定できます ( も参照stdalign.h
)。無料で公開されている C11 標準のドラフトで調べることができます。
プロトコルをエンコード/デコードするためにユニオンオーバーレイのようなことを計画しているようです。これは悪い考えです。フィールドごとに適切なシリアライズ/デシリアライズを行う方がはるかに優れています。これははるかにポータブルです。
ある種のディレクティブに依存することは、おそらく良い考えではありません。私はそれをしません。ここでは、カスタムのシリアライザー/デシリアライザーが標準です。
struct
宣言を処理し、一連のシリアライズ/デシリアライズ関数を準備する単純なパーサーを作成することをお勧めします。単純で単純な古いデータ構造である場合、パーサーとコード ジェネレーターは非常に単純で効率的です。