したがって、次のような「構造体」があるとします。
struct Vertex
{
float posX, posY, posZ;
}
ここで、3 つの float (約 4 バイト) 値を宣言しました。全体として、この「構造体」は約 12 バイトです。
しかし、私が次のように書くと:
struct Vertex
{
float pos[3];
}
上記と同じ効果が得られますか?12バイト?違いはなんですか?
したがって、次のような「構造体」があるとします。
struct Vertex
{
float posX, posY, posZ;
}
ここで、3 つの float (約 4 バイト) 値を宣言しました。全体として、この「構造体」は約 12 バイトです。
しかし、私が次のように書くと:
struct Vertex
{
float pos[3];
}
上記と同じ効果が得られますか?12バイト?違いはなんですか?
理論上、最初のケースでは、コンパイラはさまざまなフィールド間にパディングを追加できますが、2 番目のケースでは許可されません (配列は要素の連続したシーケンスでなければなりません)。
したがって、理論的には最初のstruct
方がより多くのスペースを必要とする可能性がありますが、実際には、おそらく同じサイズ/メモリ レイアウトになります。
明らかに、最初のケースでは 3 つのメンバーの名前を使用してそのようなデータにアクセスできますが、2 番目のケースではpos
メンバーに対して配列構文を使用します。
1 つの違いを考えることができます:パックが変数のサイズよりも大きい場合、コンパイラは posX、posY、posZ をパディングして、それらを適切に整列させます。バイナリの読み取り/書き込みを行っているときは、せいぜい重要です。
通常、特定のパディングを使用する重大なパフォーマンス上の理由があります。プロセッサにアラインされていないデータを供給すると重大な結果が生じる可能性があるためです。