class Test
{
int x;
};
int main()
{
cout << sizeof(Test) ;
return 0;
}
出力:4
私は、クラス4のどのオブジェクトを作成していないのに、なぜ4をプリントするのか尋ねたいだけです。クラスでメモリが必要ですか?
class Test
{
int x;
};
int main()
{
cout << sizeof(Test) ;
return 0;
}
出力:4
私は、クラス4のどのオブジェクトを作成していないのに、なぜ4をプリントするのか尋ねたいだけです。クラスでメモリが必要ですか?
sizeof(X)
は、作成時にX
がとるバイト数です。 new
への呼び出しは、メモリ使用のオーバーヘッドに数バイトを使用する傾向がありますが、X[N]
の自動ストレージ(オンスタックまたはローカルまたはグローバルまたは静的など)の配列は実際にはN*sizeof(X)
というメモリを使用します(関数ローカル統計スレッドの安全性要件のため)。
タイプ自体に必要なメモリ量とは関係ありません。
クラスは、最適化されていないメソッド、vtable(virtual
キーワードの使用による)などがある場合、メモリを使用します。次に、クラスまたはクラスのインスタンスのメモリコストの外部に、コードまたは仮想関数テーブルを格納するメモリが存在する可能性があります。
C++言語自体では、クラス自体のメモリ量を判断する方法も、new
のオーバーヘッドを確実に判断する方法もありません。通常は、特定のプラットフォームの実行時の動作、またはコンパイラまたはランタイムライブラリのコードを調べることで、それを解決することができます。
一般に 'class'や' struct'は概念であり、変数(データ)空間を占有しませんが、コンパイラのメモリ内のメモリを占有します。 'class'や' struct'にメソッドがある場合、メソッドが実行されると(リンカは使用されない関数を削除する傾向があります)、それらのメソッドは* code *スペースを使います。 'class'や' struct'の変数やインスタンスはメモリを消費します。 –
@thomあなたは同意しているのか、同意していませんか?コードとデータメモリを区別するシステムはほとんどありません(一部のシステムではROMなどにコードを書き込みます)。私はいくつかそこにもvtablesをエンコードすることができると思います。しかし、最新のコンピュータでは、メモリは、ページテーブルに設定された多くの保護/実行ビットを伴うメモリです。私の主張は、クラスが「記憶を取る」ことができるいくつかの方法があることです。実際には、非常に短いプログラムから猥褻な量の型を生成するコードを書くことができるので、これはpriblemでもあります。 – Yakk
メモリスペースを占有する静的メンバー変数を引用することを忘れないでください;) – YSC
車の燃料タンクには50リットルの燃料がありますか?「体積(fuel_tank)」は50リターンですか? – BitTickler
私はビットティッカーのおかげでそれを得た。 – shuboy2014
技術的には、OSは実行可能ファイルをメモリにロードしなければならなかったので、クラスがメモリを取るかもしれません!ここでのキーワードは「可能」です。なぜなら、すべてがOSの実行可能ファイルの処理方法と、コンパイラがクラスをコンパイルする方法と、CPUのアーキテクチャが何であるかによって異なります。 –