3

次のリンクに記載されているように、コンパイラが整列を処理します。

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

プログラムで調整する必要があるシナリオと、コンパイラーがそれを行うシナリオはどれですか?

エンディアン タイプが異なる 2 つのマシン、つまり 1 つの m/c がビッグ エンディアンで、もう 1 つがリトル エンディアンであり、TCP/IP プロトコルを介して通信する場合、パディングは必要ですか?

私の質問を明確にしてください。

ありがとう!

4

2 に答える 2

2

write()生の構造体(または関数が何であれ)を送信するときは、パディングとアラインメントについてのみ心配する必要があります。構造体の送信が本当に必要な場合は、コンパイラにパディングをオフにして 1 バイト境界に合わせる方法について、コンパイラのドキュメントを確認してください。ただし、コンパイル対象のアーキテクチャのデータ最適化を効果的にオフにしているため、これはネットワーク層でのみ行ってください。アプリケーション固有のアルゴリズム (大量の読み取りと書き込み) で構造体を使用している場合、アライメントとパディングの設定いじると、パフォーマンスが低下します。

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

于 2012-04-26T10:36:27.660 に答える
1

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

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

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

于 2012-04-26T10:26:15.810 に答える