他の人が述べたように、これは標準の一部ではなく、問題のプロセッサに適していると思われるため、実装するコンパイラに任されています。たとえば、VC は、x86 プロセッサとは異なるアライメント要件を ARM プロセッサに簡単に実装できます。
Microsoft VC は、#pragma pack ディレクティブまたは /Zp コマンド ライン オプションで指定されたサイズまで、基本的に自然配置と呼ばれるものを実装します。これは、たとえば、サイズが 8 バイト以下の POD タイプは、そのサイズに基づいて整列されることを意味します。それより大きいものは、8 バイト境界に整列されます。
さまざまなプロセッサやさまざまなコンパイラのアライメントを制御することが重要な場合は、パッキング サイズ 1 を使用して構造体を埋め込むことができます。
#pragma pack(push)
#pragma pack(1)
struct Example
{
short data1; // offset 0
short padding1; // offset 2
long data2; // offset 4
};
#pragma pack(pop)
このコードでは、padding1
data2 が自然に配置されるようにするためだけに変数が存在します。
への答え:
はい、それは簡単にデータの不整合を引き起こす可能性があります。x86 プロセッサでは、これはまったく問題になりません。他のプロセッサでは、これによりクラッシュが発生したり、実行が非常に遅くなる可能性があります。たとえば、Alpha プロセッサは、OS によってキャッチされるプロセッサ例外をスローします。次に、OS は命令を検査し、位置合わせされていないデータを処理するために必要な作業を行います。その後、実行が続行されます。この__unaligned
キーワードを VC で使用して、x86 以外のプログラム (CE など) のアライメントされていないアクセスをマークすることができます。