質問
次の2つのタイプがなぜなのか疑問に思っています
struct {
double re[2];
};
and
double re[2];
Cでも同じサイズですか?構造体はサイズのオーバーヘッドを少し追加しませんか?
解決
いいえ、すべての要素を1つの上位要素に構成するだけで、そのサイズは単に個々の要素のサイズが加算されただけです(さらに、配置規則に応じてパディングが行われますが、これはこの質問の範囲外です)。 / p>
他のヒント
それが助けになるかどうか-いいえ。 Cはペストのようなオーバーヘッドを回避します。具体的には、このコンテキストでのオーバーヘッドを回避します。
異なる構造を使用した場合、違いが生じる可能性があります:
struct space_filled
{
char part0;
double part1;
};
マシンで double
を8バイト境界に揃える必要がある場合(および sizeof(double)== 8
。これは標準ですが、標準では義務付けられていません) )、構造が16バイトを占めることがわかります。
いいえ、構造体は何も追加する必要はありません。 CやC ++では、クラス(および構造体)が他の多くの責任を負うJavaや.NETとは異なり、これらは単に多くのデータメンバーを保持するために使用されるコンテナです。 C ++では、仮想関数呼び出しが存在する場合、それらを解決するためにvtableを保存する必要がありますが、一般に、構造体自体にはオーバーヘッドがありません。
唯一の例外はこれです:
typedef struct {} empty;
assert(sizeof(empty) > 0);
空の構造体のサイズはゼロではありません 。すべてのオブジェクトには一意のアドレスが必要なため、構造体のサイズはゼロ以外の some である必要があります。 (そうでなければ、これらの構造体の配列を作成することはできません)
いいえ。 Structはサイズを追加したり、コンパイルされたCにオーバーヘッドを追加したりしません。
これは、コンパイラーによる追加作業が必要な構文のレイヤーですが、実行時のオーバーヘッドはありません。
Cは非常に「裸」です。必要な場合を除き、何も存在しないことを意味します。 そこで、「構造体が必要とするオーバーヘッドはどれくらいですか?」と自問してみてください。
いいえ、そうではありません。
これは構造体の優れた点の1つです(古い学校のTCP / IPプログラミングで非常に役立つ理由)。
メモリ/バッファレイアウトを表すのに良い方法です。
Cの構造体型は、メモリ内のメンバーを順番にレイアウトするだけです
sometmes、参照: http://en.wikipedia.org/wiki/Sizeof