2012-04-26 9 views
0

私のプロジェクトでコードを実行しています。私たちはこのような構造で間で揃えている理由C構造のアライメント/パディング

typedef struct { 
    ULONG gatewayIp; 
    UBYTE status; 
     UBYTE align; 
    UWORD info; 
    ULONG magicTemp; 
    uword stationCode; 
} GatewayStatus; 

私の質問は次のように

は、構造体定義されている次のよう。

次のリンクに記載されているように、私はコンパイラが調整を行います。

http://vcfaq.mvps.org/lang/11.htm私は私の質問は、私たちがプログラムで合わせているかのシナリオの下に関係なく、上記構成 の一般化と私たちのためにその何シナリオコンパイラをしますか?

エンディアンの種類が異なるエンディアンが2つあるマシン(ビッグエンディアン、ビッグエンディアン、ローエンドの場合)が必要ですか?

私の質問を親切に明確にします。

ありがとうございます!

+0

この構造体はどのコンテキストからですか?この構造体のバイナリダンプを使用してI/Oを行うライブラリではないでしょうか? – Cameron

+0

私はそれが開発者がこのような方法でこの構造を定義することを決めた専用製品に関連しているので、悪い例だと思います。たぶん単語(2バイト)を整列させます。これはコンパイラの提出とは関係ありません。 –

+0

すべてのコンテンツにCが表示されている場合のC++タグとは何ですか? –

答えて

0

そこには、その場所にパッドバイトがあることは明らかです。将来誰かがバイトフィールドを追加したい場合に便利です。

構造体がアライメント要件のないシステム(通常は8ビットアーキテクチャの場合)で使用されますが、それでも大きなマシンと同じレイアウトを持つ必要がある場合もあります。この場合、構造体の定義には明示的な埋め込みが必要です。

0

コンパイラは、デフォルトで最大整列可能バイトのデータを整列します。これはマシンによって異なります。 Linuxの場合、GCCコンパイラはデフォルトで4バイトのアライメントを行っています。

8,16,32、etc ...バイトを整列させたい場合は、コンパイラに明示的に伝える必要があります。