このドキュメントで説明するソフトウェアは、Extended SupportまたはSustaining Supportのいずれかにあります。 詳細は、https://www.oracle.com/us/support/library/enterprise-linux-support-policies-069172.pdfを参照してください。
Oracleでは、このドキュメントに記載されているソフトウェアをできるだけ早くアップグレードすることをお薦めします。
pack
プラグマ・ディレクティブを使用すると、構造体、共用体またはクラス・メンバーに異なるパッキング位置合せを指定できます。
#pragma pack(push, 1) struct mystruct { char c1; // 1-byte double d2; // 8-byte }; #pragma pack(pop)
ほとんどのコンパイラには、デフォルトの埋込みを無効にする標準外の拡張機能が用意されています(プラグマ、コマンドライン・スイッチなど)。 詳細は、コンパイラに付属のマニュアルを参照してください。 位置合せがカスタマイズされた構造体を、異なるパッキング位置合せを使用する外部ライブラリの関数に渡すと、互換性に関わる深刻な問題が発生する可能性があるので、位置合せをカスタマイズした構造体メンバーを使用する場合は注意が必要です。 そうした問題を回避するには、デフォルトの位置合せを使用したほうが、ほとんどの場合うまく行きます。
一部の事例では、構造体のメンバー間にバイトを埋め込まないことが必須となる場合もあります。 たとえば、アプリケーションが、シリアライズされたデータをネットワーク経由で送信する場合です。 バイトを埋め込まないようにすることでネットワーク使用率が劇的に向上する可能性があります。
ただし、受信側で構造体メンバーにアクセスするときには注意が必要です。 通常は、バイト単位で読み取るという手段で、間違った位置合せによるエラーを回避できます。
1つのプラットフォームから転送した生データを別のプラットフォームにロードできるようにするには、2つのプラットフォームでは基本の型のサイズとエンディアンネスを同じにする必要があるだけでなく、位置合せの互換性も備えている必要があるということが、これではっきりしたはずです。 そうでない場合、型の内部のメンバーの位置、さらには型自体のサイズさえもが合わなくなる可能性があります。 mystruct
に対応するデータをx86/x86-x64システムとSPARCシステムの間で移行すると、構造体で使用されている型のサイズが同じであっても、まさにこうした事態が発生します。