2017-08-16 11 views
3

クラス定義がメモリを占める場合は約this、関数がメモリを占める場合はthisとなっています。これは私が得られないものです:関数が行うか、コードが行うなら、どのようにクラス定義がメモリを占有しないのでしょうか。つまり、クラス定義もコードなので、関数コードのようにメモリを占有すべきではありませんか?クラス定義はどのようにメモリを占有しませんか?

+1

あなたがリンクした最初の質問の一番上の回答から:_ "クラスには、最適化されていないメソッド、vtable(仮想キーワードの使用によるもの)などがある場合、メモリが使用されます。 – YSC

+6

クラス定義は、そのクラスのオブジェクトの青写真としてコンパイラによってのみ使用されます。プログラムがコンパイルされると、クラス定義自体は最終実行ファイルには存在せず、そのクラスに対して作成されたオブジェクトのみが存在します。 –

+1

クラスメソッドは空き関数と同じようにスペースを取る。 Vtablesとtypeid情報にはスペースが必要です。残りの部分では、生成されたコードにクラスの構造が暗黙的に含まれており、生成されたバイナリには別のクラスエンティティはありません。 –

答えて

4

クラス定義がメモリを占有していないと言うのは全く正しいとは言えません。コードの量と実際の配置は関数のインライン展開に大きく依存しますが、ようにメンバ関数、静的メンバー、インライン関数、ディスパッチ・テーブル等を記憶するためのメモリ要件を除外クラスのインスタンスごとのメモリ要件を示しsizeof、約最初のリンク協議で

Q & A。これは、クラスのすべてのインスタンスの中で、これらすべての要素が共有であるためです。

+0

ありがとう!しかし、クラス定義はコードでもあるので、関数コードのようにメモリを占有してはいけませんか? "という質問に答えました。もしそうなら、それを指摘してください。:) –

+0

@sdsadasdasdクラス定義は、クラスに入るすべてのものをグループ化するコンストラクトです。この方法では、名前空間に似ています。コンパイル中にのみ存在します。コンパイラが完了すると、クラス定義に含まれるもの(メンバー関数、静的メンバーなど)がメモリに格納されますが、クラス定義自体は実行時に不要になると破棄されます。 – dasblinkenlight

+0

ありがとう!それは今より意味をなさない。しかし、関数がクラス定義のように機能しない理由を、どのように説明しますか?私は、コンパイラが各関数呼び出しを関数自体によって与えられた命令で置き換えることができないため、実行前にクラス定義と同様に関数コードを取り除くことができないのでしょうか?それ以外の場合は悲しいので答えます:)) –

0

クラスのインスタンスを作成する方法の詳細は、そのコンストラクタでエンコードされているため、クラス定義はどこにも保持する必要はありません。
は(ある意味では、クラス定義は、それが単に明示的に示されていない、コードです。)

あなたがオブジェクトを作成するために知っておく必要があるのは、それがどのくらいの大き

  1. あり、
  2. 作成に使用するコンストラクタはどれですか?
  3. 仮想関数はどれですか。

クラスAのインスタンスを作成する:

  1. 予約サイズsizeof(A)(または1つを渡すこと)のメモリの一部、
  2. Aの仮想関数とメモリのその部分を関連付け、 (通常は所定の場所のテーブルに保持されています)、
  3. Aを作成する必要があるコンストラクタをAに伝えてから、実際の作業を行います。あなたはメンバ変数またはそのような何かの種類についての事を知っている必要はありません

、コンストラクタは、彼らがオブジェクトが作成されるを知っていれば何をすべきか知っています。
は、(すべてのメンバ変数は、オブジェクトの先頭からのオフセットで見つけることができますので、コンストラクタは物事がでなければならない場所を知っている。)

機能を作成するには、他の一方で、あなたは保存する必要がありますその定義を何らかの形で実行し、実行時にコードを生成します。 (これは通常「ジャストインタイム」コンパイルと呼ばれます。)

は、これはあなたがどちらか

  1. は、すべての実行中のコンパイラ、または
  2. 提供します(またはインストールするには、誰もが必要な)すべての実行可能ファイルの共有コンパイラ(Javaのインクルードする必要があることを意味し、コンパイラが必要ですVMは通常、少なくとも1つを含む)。

代わりにC++コンパイラが事前に関数を生成します。
用語を濫用すると、関数がソースコードを青写真としてコンパイルプロセスによって「インスタンス化」されていると言えるでしょう。

+0

ありがとう!しかし、関数に関しては、(関数内で提供される命令を実行しているので)関数を実行するために、特定の関数からの命令が必要です。オブジェクトをインスタンス化する方法についての単純な青写真であるクラス定義...私は正しい?それ以外の場合は、私を修正してください:-) –

関連する問題