CおよびC++では、コンパイラーは構造体のデータメンバーを並べ替えることが許可されていないため、それらの並べ替え方法に注意しないと、スペースを浪費することになります。例えば:
struct S {
int i;
void *p;
int i2;
};
int
32ビットと64ビットのポインタを備えたプラットフォームではi
、最初に配置され、次に32ビットのパディングが配置されるため、p
64ビットに揃えることができます。i2
次に、次の単語の半分を占め、その後にさらに32ビットのパディングが続きます。結果の構造体の長さは24バイトですが、p
最初に宣言された場合、長さはわずか16バイトになります。配列にこれらの構造体が多数ある場合、メモリを節約し、キャッシュチャーンを減らすために、パディングを見つけて削除することが重要な最適化になることがあります。
Javaに同じ機能があるかどうか知りたいです。ボックス化されていないタイプ(int
およびなどboolean
)は、参照と同じサイズかそれよりも小さいですか?そして、それらが小さい場合、コンパイラーは、後続のフィールドを整列させるためにパディングを挿入しないように、それらを並べ替えることができますか?最後に、もしそうなら、コンパイラはこれを行いますか?
現在、これについて特に最適化する必要はありません。Cの場合のように、フィールドを宣言する順序を選択するときに、これを念頭に置く必要があるかどうかを知りたいだけです。