5
gccの__attribute __((packed))/ #pragma packは安全ではありませんか?
Cでは、コンパイラーは構造体のメンバーを宣言された順序でレイアウトし、メンバー間に、または最後のメンバーの後に挿入される可能性のある埋め込みバイトを使用して、各メンバーが適切に配置されるようにします。 gccは言語拡張を提供します__attribute__((packed))。これは、パディングを挿入しないようにコンパイラーに指示し、構造体メンバーを誤って調整できるようにします。たとえば、システムが通常すべてのintオブジェクトに4バイトアラインメントを必要とする場合、構造体メンバーが奇数のオフセットに割り当てられる__attribute__((packed))可能性がありintます。 gccドキュメントの引用: 「packed」属性は、「aligned」属性でより大きな値を指定しない限り、変数または構造体フィールドが可能な限り最小のアライメントを持つことを指定します。変数には1バイト、フィールドには1ビットです。 コンパイラーは(一部のプラットフォームでは)一度に1バイトずつ誤って配置されたメンバーにアクセスする必要があるため、この拡張機能を使用すると、データ要件は小さくなりますが、コードは遅くなります。 しかし、これが安全でないケースはありますか?コンパイラーは常に、パックされた構造体の誤って配置されたメンバーにアクセスするための正しい(低速ですが)コードを生成しますか?すべての場合にそれを行うことは可能ですか?
164
c
gcc
pragma-pack