x86上のC構造体の典型的なアライメントとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > x86上のC構造体の典型的なアライメントの意味・解説 

x86上のC構造体の典型的なアライメント

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/09/19 14:58 UTC 版)

データ構造アライメント」の記事における「x86上のC構造体の典型的なアライメント」の解説

構造体メンバは、メモリ順番格納されるため、以下の構造体では、メンバData1は常にData2の前に、Data2は常にData3の前に配置されるstruct MyData{ short Data1; short Data2; short Data3;}; short型が2バイトメモリ格納されている場合上記構造体の各メンバ2バイトアラインされる。Data1はオフセット0、Data2はオフセット2、Data3はオフセット4になる。この構造体サイズは6バイトになる。 構造体の各メンバの型は通常デフォルトアライメントを持つ。つまり、プログラマから別途要求されない限り、あらかじめ決められ境界アラインされる。次の典型的なアライメントは、Microsoft (Visual C++)、Borland/CodeGear (C++ Builder)、Digital Mars (DMC)、GNU (GCC) で32ビットx86用にコンパイルする場合のものであるchar1バイト) - 1バイトアライメント short2バイト) - 2バイトアライメント int(4バイト) - 4バイトアライメント long(4バイト) - 4バイトアライメント float(4バイト) - 4バイトアライメント double(8バイト) - Windowsでは8バイトアライメント。Linuxでは4バイトアライメント(コンパイル時に-malign-doubleオプションをつけると8バイトlong long(8バイト) - 4バイトアライメント long doubleC++ BuilderDMCでは10バイトVisual C++では8バイトGCCでは12バイト) - C++ Builderでは8バイトアライメント、DMCでは2バイトアライメント、Visual C++では8バイトアライメント、GCCでは4バイトアライメント ポインタ(4バイト) - 4バイトアライメント LP64モデル64ビットシステムは次の通りである。 long(8バイト) - 8バイトアライメント double(8バイト) - 8バイトアライメント long long(8バイト) - 8バイトアライメント long doubleGCCでは16バイト) - GCCでは16バイトアライメント ポインタ(8バイト) - 8バイトアライメント 一部データ型実装依存する次に挙げる構造体は、様々な型のメンバ有しており、そのバイト数を単純に合計すると8バイトになる。 struct MixedData{ char Data1; short Data2; int Data3; char Data4;}; コンパイル後、構造体にはパディングバイトが追加され、各メンバ適切なアライメント保証されるstruct MixedData /* After compilation in 32-bit x86 machine */{ char Data1; /* 1バイト */ char Padding1[1]; /* 次のshort型を2バイト境界アラインするための1バイトパディング構造体が始まるアドレス偶数であると仮定。 */ short Data2; /* 2バイト */ int Data3; /* 4バイト - 最も大きな構造体メンバ */ char Data4; /* 1バイト */ char Padding2[3]; /* 構造体サイズ12バイトにするための3バイトパディング */}; 構造体コンパイルされたサイズ12バイトになる。最後メンバの後にもパディングバイトが追加されていることに留意されたい。この場合構造体合計サイズは、構造体メンバ最大アライメント倍数となる。上の例では、構造体12バイトサイズパディングするために最後メンバの後に3バイト追加されるstruct FinalPad{ float x; char n[1];}; 上記の例では、sizeof演算子により算出される FinalPad 構造体サイズ sizeof(FinalPad) は5ではなく8(floatアライメント倍数)になる。 struct FinalPadShort{ short s; char n[3];}; 上記の例では、FinalPadShort 構造体サイズ sizeof(FinalPadShort) は5や8ではなく6(shortアライメント倍数)になる。 構造体メンバ順序変更したり、構造体メンバコンパイラアライメント変更パッキング)して、必要なメモリを減らす(または既存形式準拠させる)ために、構造体アライメント変更することができる。前述の MixedData 構造体にこれを適用すると、次のうになるstruct MixedData /* 並べ替え後 */{ char Data1; char Data4; /* 並べ替えられた */ short Data2; int Data3;}; これにより、構造体コンパイル後のサイズが、メンババイト数を単純に合計したサイズである8バイト一致するようになった。Padding1[1] は Data4 によって置き換えられ(従って排除され)、構造体は既にlong wordサイズアラインされているので、 Padding2[3] はもはや必要ではない。 MixedData 構造体1バイト境界アライメントさせる別の方法は、プリプロセッサ構造体メンバ所定アライメント破棄させ、これによりパディングバイトを挿入しないようにすることである。 C11およびC++11よりも前の規格では、構造体メンバアライメント定義する標準的な方法はないが、コンパイラ中には #pragma ディレクティブ使用してソースファイル内のパッキング指定するものがある。次にその例を示す。 #pragma pack(push) /* 現在のアライメントスタックプッシュ */#pragma pack(1) /* 1バイト境界アライメント設定 */struct MyPackedData{ char Data1; long Data2; char Data3;};#pragma pack(pop) /* スタックから元のアライメント復元 */ この構造体は、32ビットシステムで6バイトのコンパイルサイズを持つ。上記ディレクティブは、MicrosoftBorlandGNUなどのコンパイラ利用できる。 もう1つの例: struct MyPackedData{ char Data1; long Data2 __attribute__((packed)); char Data3;};

※この「x86上のC構造体の典型的なアライメント」の解説は、「データ構造アライメント」の解説の一部です。
「x86上のC構造体の典型的なアライメント」を含む「データ構造アライメント」の記事については、「データ構造アライメント」の概要を参照ください。

ウィキペディア小見出し辞書の「x86上のC構造体の典型的なアライメント」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「x86上のC構造体の典型的なアライメント」の関連用語

x86上のC構造体の典型的なアライメントのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



x86上のC構造体の典型的なアライメントのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaのデータ構造アライメント (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS