2009-06-19 23 views
6

なぜ私は次の2つのタイプの構造体の型サイズへの寄与

struct { 
    double re[2]; 
}; 

double re[2]; 

はCで同じサイズですか?構造体が少しのサイズオーバーヘッドを追加しないのですか?

答えて

23

いいえ、すべての要素を1つの上位要素にまとめるだけで、個々の要素のサイズが加算されます(さらに、配置規則によってはいくつかのパディングが追加されますが、これはこの質問の範囲外です)。

+0

+1を。 –

+1

構造体のアライメントの効果については、http://www.unidata.ucar.edu/blogs/default/2009/03/30/1238442300000を参照してください。html – VolkerK

12

それが役に立たない場合はありません。 Cはペストのようなオーバーヘッドを避けます。具体的には、この文脈でオーバーヘッドを避けます。

あなたは異なる構造を使用した場合は、差額表示される場合があります。あなたのマシンが正常であるが、で義務付けられていない8バイト境界(とsizeof(double) == 8、上に整列させるdoubleを必要とする場合

struct space_filled 
{ 
    char  part0; 
    double  part1; 
}; 

は、標準)の場合、構造体が16バイトを占めることがわかります。

+0

別に宣言されたchar&doubleは、まだパディングが存在するので、同じ量のスペースをとります。それは見えないスタックスペースに過ぎません。しかし、アイテムのアドレスによって、パディングが表示されます。 – abelenky

+0

必ずしもそうではありません - 別のchar、shortまたはint、またはそれぞれが順番に(かなり普通のサイズの仮定の下で)あった場合、スペースはありません。しかし、そのような「詰め物」変数がない場合、あなたは正しいです。 (そして、私はC言語の標準がローカル変数が互いに特定の順序で配置されることを保証しているとは思っていません)。 –

+1

@Jonathan:コンパイラは自動化を命ずることができますそれが望めば、スペースを節約するのが好きです。実際、オートマティックへのポインタがローカルスコープを離れない限り、オートマトンはスタック上にある必要はありません。コンパイラは、好きなときにそれらをレジスタに保持することができます。おもう。 –

3

いいえ構造体は、それはコンパイラによって追加の作業が必要ですが、実行時にオーバーヘッドを持っていない構文の層であり、任意のサイズを追加したり、コンパイルC.

内の任意のオーバーヘッドを持っていません。

Cは非常に「裸の」言語であり、必要な場合を除いては何も存在しません。 それでは、 "構造体に何のオーバーヘッドが必要ですか?"という質問をしてください。

2

いいえ、それはありません。

これは構造体の優れた点の1つです(なぜ、それらは古い学校のTCP/IPプログラミングで非常に役に立ちましたか)。

メモリ/バッファのレイアウトを表すのに適しています。

0

Cで無構造体型だけ順次いやメモリ

5

にメンバーをレイアウト、構造体には何も追加する必要はありません。 Javaや.NETとは異なり、クラスや構造体には他の責任がありますが、CやC++では、単に複数のデータメンバーを保持するためのコンテナです。 C++では、存在すれば仮想関数呼び出しを解決するためにvtableを格納しなければならないかもしれませんが、一般的には、構造体自体にオーバーヘッドはありません。

typedef struct {} empty; 
assert(sizeof(empty) > 0); 

空の構造体のサイズゼロでないう:これは

一つの例外があります。構造体には、あるいはのサイズがあります。すべてのオブジェクトに固有のアドレスが必要です。

+1

+1は空の構造体に言及します。 –

0

sometmes(そうしないと、これらの構造体の配列を作成することはできないでしょう)、以下を参照してください。アライメントを言及するためhttp://en.wikipedia.org/wiki/Sizeof

関連する問題