2016-12-30 20 views
0

私は、もはや会社で働いていないスーパースターによって開発されたいくつかのレガシーコードを通過しています。彼のコードを通して、彼は構造体を詰め込んだ。しかし、私は彼が1要素だけで構造メンバーのためにこれをやっているのを見る。私は、彼がこのようにして何か利点があるかどうかはわかりません。何か不足していますか?__attribute __((packed))は、1つの要素しかない構造体にあります

サンプルコード:

struct A { 
    uint32_t a __attribute__((packed)); 
}; 
+2

パッキング構造体は当然のことではありません。あなたは実行時間のためにメモリ消費量を取引していますが、メモリが逼迫しているシステムでない限り、通常は非常に悪い取引です。 –

+1

@Cody Greyあなたのコメントにほとんど同意します。しかし、正確なレイアウトを知る必要がある場合は、構造体をパックすることが理にかなっています。たとえば、ネットワーク経由で転送する必要があり、反対側で展開/解析する必要がある場合などです。 –

+1

@ jesperおそらく、私はそれが非常に説得力があるとは思わない。パッキングではエンディアンの問題が発生し、移植性があまり良くありません。また、ネットワークを介してデータを転送する場合は、ある種のプロトコルが必要になります。したがって、プロトコルではその違いを処理する必要があります。おそらく、構造体をディスクにシリアル化する*バイナリ互換性について考えているでしょうか?これはポータブルではないという定義であり、私は良い考えではないとも言います。少なくとも、APIを設計しているわけではありません。明らかに、サードパーティのAPIとの互換性の理由から、コンパイラ拡張が存在しなければなりません。 –

答えて

5

これはターゲットアーキテクチャによって異なり、主に配列に影響します。 32ビットアーキテクチャの場合、あなたの例は実際には効果がありません。一方、64ビットアーキテクチャの場合、パック属性なしでは、コンパイラは、構造体Aの配列内のエントリを64ビットに整列させ、各エントリ間に32ビットのギャップを残します。

重大なメモリの制約に直面していない限り、おそらく悪い考えです。

エリックレイモンドの"The Lost Art of C Structure Packing"は、このトピックで非常に価値のある記事です。

+0

あなたはリンクのための+1を得る:) –

+0

それはそれです。私はコードを見ていたときに申し訳ありませんでした配列について考えていない – Sid

0

gcc's documentation __attribute__ ((packed))に係る構造体のフィールドは可能な最小アラインメントを有していなければならないことを指定します。

したがって、フィールドを1つしか使用していないか使用していない構造体では、違いはありません。

関連する問題