Cでプラグマpack(1)を実行することの欠点は何ですか?通信プロトコル用にいくつかの構造体データを定義しましたが、バイトアラインメントをオフにして、データが正確にあるべき場所にあり、構造体の実際のサイズ(11バイト)を取得します。バイトアラインメントをオフにすることの欠点は何ですか?パフォーマンスですか?
3 に答える
パフォーマンスが低下します。
整数(およびその他のデータ型)がメモリ境界に「偶数」である代わりに、それらは簡単にアクセスでき、メモリ境界を「またがって」、それらを取得するために2回のフェッチ(CPUサイクル)を必要とする場合があります。
いくつかの「欠点」があります。
これはCではありません。一部のCコンパイラでは実装固有のハックです。
処理するバイト順序の問題がまだあるため、バイナリ構造をネットワーク経由で送信したり、ディスクに保存したりする問題については、実際には役に立ちません。
がパック構造
st.foo
のメンバーである場合、一般に、は有効ではありません。型の引数を取る関数に渡すと、呼び出された関数がポインタを介してデータにアクセスしようとしたときに、クラッシュやメモリの破損が発生する可能性があります。int
&st.foo
int *
&st.foo
int *
それは無償です。すべてのフィールドがサイズに対応する境界に配置されるため、バイナリ交換用に適切に設計された構造には、すでにゼロのパディングがあります。
はい。プロセッサ/メモリ接続の性質上、アラインされたアドレスでマルチバイト値にアクセスする方がはるかに高速です。記憶が正しければ、アラインメントもキャッシュに影響する可能性があります。
構造内のデータを大量の計算に使用する場合は、コードでアンパック バージョンを使用し、送信時にパック バージョンに変換することをお勧めします。一方、構造体の値を使用して多くの計算を行っていない場合、この変換は無駄になります。