2013-08-22 15 views
7

sizeofは、データメンバーのみを含む構造体のサイズの計算にはどのように作用するのか分かります。私はC++で次のような構造を持っている場合でも、例えばC++の関数を持つ構造体のサイズ

struct MyAdd() 
{ 
    int AddInt() 
    { 
     int a=5; 
     int b=5; 
     return a+b; 
    } 
    int c; 
    int d; 
}; 

だからsizeof機能を使用して、それはまた、機能AddInt内で宣言した変数のサイズを返しますか、それが唯一のメンバ変数(cdを)検討しますか?

+0

なぜコードを実行しないでください。 – nommyravian

+3

'sizeof'は関数ではなく、演算子です。 –

答えて

18

メンバー変数のみを考慮します。

さらに、非仮想メンバ関数は、ランタイムサポートを必要としないため、structのサイズに寄与しません。

それはそうである理由ビューのコンパイラの観点から、このコードは、この擬似コードに非常に類似していることを想像し、理解する:

struct MyAdd 
{ 
    int c; 
    int d; 
}; 

int MyAdd_AddInt(MyAdd* this) 
{ 
    ... 
} 
+0

非仮想メンバ関数_usually_は貢献しません... - 貢献しないというルールはありません。 – MSalters

+0

@MSalters:それは本当です。しかし、インスタンスサイズに寄与させるコンパイラについて知っていますか? –

2

(これらの関数内の変数を含む)関数のコード部分がカウントされることはありません任意のデータ項目のサイズの一部として使用できます。

構造体に仮想関数がある場合は、構造体のサイズに追加される可能性があります。

コンパイラは、データ構造内のメンバーの適切なアライメントをサポートするために、データ要素間にパディングを自由に追加することもできます。

つまり、sizeofは、個々の要素より大きなサイズを生成することがあります。しかし、どのメンバ関数もそのサイズには含まれません。

2

sizeofは、そのタイプのインスタンスの占有メモリサイズを計算します。 struct/classインスタンスの場合、各インスタンスのデータメンバーが異なり、独立したメモリ(rwデータセグメントに格納されている)を必要とする一方で、関数は各インスタンスの余分なメモリ(テキストセグメントに格納された)を占有しません。

関連する問題