2011-12-20 10 views
0

最近、異なるハードウェアアーキテクチャで動作する2つのアプリケーションを統合していました。ネットワークバイトオーダーの問題と構造体のパディングの問題がありました。ビットフィールドとプラグマ

どちらも、修正するのは簡単だった - パディングのために特別に、私はちょうどように私のネットワーキングの構造体の周りにプラグマを追加する必要がありました:

#pragma pack(1) 
struct {}; 
#pragma pack(0) 

私は私が持っている昨日たもののビットフィールドに関連する質問のカップルを見ました使われたことがない。私は疑問に思っていました...ビットフィールドを使って構造体を定義することによって、パディングをやめさせるのがより適切でしょうか?このシナリオでは、これはまったく役に立ちましたか?

また、私はC++コードの多くをビットフィールドに当てていません。それらはあまり使われていないCのものか、それを使用していないコードで作業したことがありますか?

+0

ビットフィールドを使用するコードで作業したことはありません。彼らは**適切な場所で非常に便利です**。彼らは適切である場所は、いくつか特定しています。 –

答えて

3

いいえ、ビットフィールドは、ネットワークパケット定義などの外部表現にとって恐ろしい選択です。ビットフィールドのメモリ内のレイアウトを選択することは、コンパイラに完全に任されています(ビットの順序、所与のフィールドに予約されているバイト数など)ので、相互運用性を完全に無効にします。

これは、あなたが遭遇した理由のために、これにも「裸の」構造を使用することに反対しています。

私の見解では、適切な方法は、手動でフィールドを1つずつシリアル化/シリアル化解除することです。

+0

ええ、私たちのインターフェイスのほとんどは何らかの種類のシリアライズ形式を使用しています(驚くほど不便なものを選んだのですが)。このインターフェースは、もっと問題になることはありませんでしたので、私は今、さらに利点を見ています。 –

+1

答えに追加するには: '#pragma pack'はプラグマです。つまり、すべてのマシンには存在しない可能性があり、移植可能なコードは依存しません。なぜなら、裸の構造体(または、int型の大きさと表現はマシン間で異なるため、裸の 'int')を使用しない理由です。 –

関連する問題