7

質問に興味があったのですが、インターネットで答えが見つかりませんでした。

単純なヘッダーがあるとしましょう。

// SimpleHeader.h
class SimpleClass
  {
  int i;
  }

ご存知のとおり、このクラスのデフォルトのコンストラクターは自動的に生成されます。

今、私はさらに2つのファイルを持っています:

// First.cpp
#include <SimpleHeader.h>
// ...
SimpleClass a;
// ...

//Second.cpp
#include <SimpleHeader.h>
// ...
SimpleClass b;
// ...

First.objとSecond.objの両方にクラスのコードが含まれますか

4

5 に答える 5

4

標準から: コンストラクターを記述しない場合、デフォルトのコンストラクターが提供されます。このデフォルトのコンストラクターはインラインで定義され、空のコンストラクターと同等T::T() {}です。

[編集]このようにインライン化されたコンストラクターは、実際にはマシンコードをまったく生成しないと確信しています。

于 2011-09-08T14:27:01.483 に答える
3

はい、おそらくコンパイラは、最終的にリンクされなかった場合に備えて、両方のオブジェクト ファイルにコードを生成する必要があります。次に、リンカーは 1 つの定義規則を使用して 1 つのバージョンを選択し、2 つのオブジェクト ファイルをリンクして実行可能なバイナリにするときに、もう 1 つのバージョンを破棄します。

于 2011-09-08T14:26:58.607 に答える
3

まず第一に、それは確かにコンパイラーや他の多くの状況に依存します。

3 つの一般的なシナリオを次に示します。

  1. 既定のコンストラクターが生成され、First.obj および Second.obj オブジェクト ファイルのそれぞれに含まれますが、それらをリンクして実行可能ファイルを生成する場合は、そのうちの 1 つだけが使用および含まれます。

  2. コンストラクターは、オブジェクトを作成するすべての場所でインライン化されます (通常、単純なコンストラクター、コンパイラーがメモリをゼロにすることができる場所のみ)

  3. デフォルトのコンストラクターを生成/呼び出す必要はありません。これは、ファイル スコープでオブジェクトを宣言し、オブジェクトのメモリをゼロに初期化する必要がある場合に発生する可能性があります。コンパイラは、プログラムの起動時にゼロに初期化された特別な領域にオブジェクトを配置し、デフォルト コンストラクターの呼び出しを完全に省略します。

于 2011-09-08T14:38:19.603 に答える
0

デフォルトのコンストラクターは、オブジェクトにスペースを割り当てるだけです。動的変数ではないため、ローダーステージでメモリがすでに割り当てられており、これ以上のコードは必要ありません。

さらに興味深いのは、複雑なコンストラクターを実装し、オブジェクトを動的に割り当てるとどうなるかということです。
その場合、両方のobjファイルにコンストラクターコードが含まれます。

于 2011-09-08T14:04:05.967 に答える
0

ない。C および C++ では、「この関数のコードはあるが別の場所にある」などと何度も宣言できます。一度しか定義できず、それを定義した場所で、その obj ファイルでコードが生成されます。したがって、3 つの .cpp ファイルと 1 つのヘッダー、クラスを定義する最初のファイル、およびクラスのオブジェクトを作成する他の 2 つのファイルがあります。他の 2 つのファイルの obj ファイルには、クラスのコードは含まれません。リンカがコードを呼び出すのに十分な情報は、定義ファイルの obj です。

複数のファイルに含まれるヘッダーにメソッド定義を暗黙的に配置することにより、クラスを 2 か所で定義する場合、定義が「同じ」であるため、リンカは気にしません。最初は各 obj にたまたま現れ、最終的なアプリケーションには、生成された 1 つのデフォルト関数の 1 つだけが含まれます。

クラスのインスタンスはいつでも好きなだけ作成でき、メソッド コードがコピーされることはありません。そのクラスのオブジェクトを使用および作成するために、さまざまなファイル、関数などすべてに対して 1 つの場所に存在します。

一部のデフォルト コンストラクターは巧妙でコードが必要な場合があります。たとえば、POD 構造体の一部は完全に最適化されていて、コードを必要としない場合があります。ただし、より多くのインスタンスを作成しても、コンストラクターを含む関数はコピーされません。

于 2011-09-08T14:27:34.820 に答える