2012-04-26 20 views
3

コンパイラを実行すると、次のリンクに記載されているように整列が行われます。ビッグエンディアンとリトルエンディアンマシン用の構造体埋め込み

http://vcfaq.mvps.org/lang/11.htm

私たちは、プログラムで整列する必要があり、私たちのためにその何シナリオコンパイラに何をするかシナリオの下で私の質問を一般化?

異種エンディアンタイプのマシンがビッグエンディアンでもう1つがリトルエンディアンで、TCP/IPプロトコルを使用して通信するには、このためにパディングが必要な場合は、パディングが必要ですか?

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

ありがとうございます!

答えて

1

TCP/IPは、ネットワークバイトオーダーをビッグエンディアンとして定義します。リトルエンディアンアーキテクチャのコンピュータでは、データを送信して受信する前に、TCP/IPヘッダー情報のバイトをビッグエンディアン形式に並べ替える必要があります。

TCP/IPスイートのすべてのプロトコルレイヤーはビッグエンディアンと定義されています。

エンディング/アライメントはエンディアンの影響を受けません。

+0

TCP/IPは、プロトコル自体の範囲内にあるパラメータのバイトオーダーのみを定義します。ペイロードは、2つのエンドポイントが一致する順番(好ましくは)にすることができます。 –

+0

良い説明:それは私が言っていることです! –

2

write()(または機能が何であれ)から生の構造を送信するときは、埋め込みと配置について心配する必要があります。コンパイラのドキュメントで、パディングを無効にする方法と、1バイト境界で整列させる方法については、実際にやりたいことがあるかどうかを確認してください。しかし、ネットワーキング層でのみこれを行います。なぜなら、あなたがコンパイルしようとしているアーキテクチャのデータ最適化を事実上無効にしているからです。アプリケーション固有のアルゴリズム(多くの読み書き)で構造体を使用している場合は、は、アライメントとパディングの設定を行うとパフォーマンスが低下します。

また、構造のすべてのフィールドが、双方が合意したエンディアン順であることも確認する必要があります。パディングとアライメントはエンディアンに影響しません。

関連する問題