2016-04-16 7 views
0
class Test 
{ 
    int x; 
}; 
int main() 
{ 
    cout << sizeof(Test) ; 
    return 0; 
} 

出力:4
私は、クラス4のどのオブジェクトを作成していないのに、なぜ4をプリントするのか尋ねたいだけです。クラスでメモリが必要ですか?

+4

車の燃料タンクには50リットルの燃料がありますか?「体積(fuel_tank)」は50リターンですか? – BitTickler

+0

私はビットティッカーのおかげでそれを得た。 – shuboy2014

+0

技術的には、OSは実行可能ファイルをメモリにロードしなければならなかったので、クラスがメモリを取るかもしれません!ここでのキーワードは「可能」です。なぜなら、すべてがOSの実行可能ファイルの処理方法と、コンパイラがクラスをコンパイルする方法と、CPUのアーキテクチャが何であるかによって異なります。 –

答えて

5

sizeof(X)は、作成時にXがとるバイト数です。 newへの呼び出しは、メモリ使用のオーバーヘッドに数バイトを使用する傾向がありますが、X[N]の自動ストレージ(オンスタックまたはローカルまたはグローバルまたは静的など)の配列は実際にはN*sizeof(X)というメモリを使用します(関数ローカル統計スレッドの安全性要件のため)。

タイプ自体に必要なメモリ量とは関係ありません。

クラスは、最適化されていないメソッド、vtable(virtualキーワードの使用による)などがある場合、メモリを使用します。次に、クラスまたはクラスのインスタンスのメモリコストの外部に、コードまたは仮想関数テーブルを格納するメモリが存在する可能性があります。

C++言語自体では、クラス自体のメモリ量を判断する方法も、newのオーバーヘッドを確実に判断する方法もありません。通常は、特定のプラットフォームの実行時の動作、またはコンパイラまたはランタイムライブラリのコードを調べることで、それを解決することができます。

+0

一般に 'class'や' struct'は概念であり、変数(データ)空間を占有しませんが、コンパイラのメモリ内のメモリを占有します。 'class'や' struct'にメソッドがある場合、メソッドが実行されると(リンカは使用されない関数を削除する傾向があります)、それらのメソッドは* code *スペースを使います。 'class'や' struct'の変数やインスタンスはメモリを消費します。 –

+0

@thomあなたは同意しているのか、同意していませんか?コードとデータメモリを区別するシステムはほとんどありません(一部のシステムではROMなどにコードを書き込みます)。私はいくつかそこにもvtablesをエンコードすることができると思います。しかし、最新のコンピュータでは、メモリは、ページテーブルに設定された多くの保護/実行ビットを伴うメモリです。私の主張は、クラスが「記憶を取る」ことができるいくつかの方法があることです。実際には、非常に短いプログラムから猥褻な量の型を生成するコードを書くことができるので、これはpriblemでもあります。 – Yakk

+0

メモリスペースを占有する静的メンバー変数を引用することを忘れないでください;) – YSC

関連する問題