2012-05-14 7 views
1

可能性の重複:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?
についてはsizeof()クラス

出力が8である理由
not sizeof(int)+sizeof(char) = 5

class CBase 
{ 
    int a; 
    char p; 
}; 

int main() { 

    cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl; 
    getchar(); 
} ///:~ 
+2

は、直前にそれを実行するアプリケーションのためにこの環境変数を設定します(アプリがVMXを使用することができないという欠点を持っている)、実行時にこれを回避する方法があります、このアライメントをしないために、 [構造体のパディング](http://en.wikipedia.org/wiki/Sizeof#Structure_padding) – iammilind

+0

詳細はこちら - > http://en.wikipedia.org/wiki/Data_structure_alignment – rt2800

答えて

5

パフォーマンス向上のため、通常、メモリはコンパイラによって調整されます。だから、クラスや構造体は、その部分の合計よりも多くの領域をメモリに取ることができます。

+3

この場合、具体的には:作成する場合'CBase'の配列であれば、次の要素は前のバイトが終わった後の次のバイトで始まります。したがって、配列の各要素で 'a'が4揃いになるようにするため、実装ではCBaseを4の倍数にパディングしています。構造体のサイズは常にその整列要件の倍数です。 –

1

コンパイラ/実行時が8バイトの境界に揃えられているかのように見えます。コンパイラやランタイムスイッチでこれを変更することができます。たとえば、AIXでは、C++のメモリー割り当ては16バイトにアライメントされており、これによりメモリー使用量が増える可能性があります。

export LIBCPP_NOVMX=1 
+0

コンパイラは8バイトに整列する必要はありません。単に 'int'を4バイトに整列させたいかもしれません。 –

関連する問題