1

私が知っているように、実行時またはコンパイル時にオブジェクトを作成できます。例えば

SomeType object1;
SomeType *object2 = new SomeType;

したがって、ここのコードではそう思います。

int main(){

    cout << "lalalal";
    SomeType object1;
}

object1 に対してコンストラクターが呼び出され、lalalal が画面に表示されます。プログラムが開始する前に、コンパイラがメモリを割り当てているためです。それで、どの時点で私は間違っていますか?

4

3 に答える 3

5

私が知っているように、実行時またはコンパイル時にオブジェクトを作成できます。

あまり。コード例では、最初のオブジェクトは自動ストレージ期間 (「スタック上」と呼ばれることが多い)で作成され、2 番目のオブジェクト は動的ストレージ期間 (「ヒープ上」と呼ばれることが多い) で作成されます。ただし、これらは両方とも実行時に発生します。

object1 に対してコンストラクターが呼び出され、lalalal が画面に表示されます。

関数内のステートメントは、上から下に実行されます (もちろん、ループは含まれません)。したがって、オブジェクトは 2 番目に作成されます。*

プログラムが開始する前に、コンパイラがメモリを割り当てているためです。

はい、メモリが事前に割り当てられている可能性があります。しかし、観察可能な影響に関する限り、それは無関係です。


* ただし、文字列に改行文字が含まれていないため、表示されるのは行バッファリングの影響です。多くのシステムでは、改行文字が受信されるか、プログラムが終了するまで、出力は表示されません。

于 2013-01-01T21:43:15.537 に答える
1

まず、C++ には、保存期間とオブジェクトの有効期間という 2 つの別個の概念があります。また、保存期間をオブジェクトの有効期間より短くすることはできませんが、その逆は必ずしも真ではありません。次に、どちらも実行時の概念であり、コンパイル時間ではありません。

ただし、この場合、実際の違いはありません。オブジェクトの保存期間と有効期間はどちらも、object1定義が実行されたときに開始され、スコープから外れたときに終了します。実際、ほとんどのコンパイラは、関数の先頭にあるローカル変数にすべてのメモリを割り当てますが、これは、準拠するプログラムが定義で割り当てられていないことを伝える方法がないためです。ただし、プログラムの観察可能な動作に影響を与えるものはすべて、標準で発生する必要がある場合に発生する必要があります。

于 2013-01-01T22:19:38.453 に答える
0

いいえ、object1あなたの例ではコンパイル時に「作成」されていません。他のオブジェクトと同じように実行時に作成されます。さらに、はコマンドの実行object1後に「構築」されるため、そのコンストラクタは後で実行されます。coutただし、その前にメモリが割り当てられていた可能性があります。

于 2013-01-01T21:49:27.150 に答える