1

これら2つの関数間で作成される一時オブジェクトの数に違いはありますか?

string foo1() {
    return "";
} 

string foo2() {
    string s = "";
    return s;
}

これは宿題の質問なので、コンパイラの最適化はないと想定してください。

4

3 に答える 3

6

一時的なものは1つだけ作成されます。関数のスタック上のオブジェクトは一時的なものではなく、左辺値です。文字列リテラルも左辺値です。どちらもまったく同じプロセスを含み、左辺値から構築された文字列を返します。

于 2011-06-12T15:58:09.913 に答える
3

はい。最適化、つまりNRVO(戻り値最適化と呼ばれる)がない場合、2番目のコードは2つの一時を生成し、最初のコードは1つを生成します。

于 2011-06-12T15:34:19.127 に答える
-2

変わりはない。どちらの場合も、新しい文字列オブジェクトが作成されます(1-暗黙的に、2-明示的に)。


どちらの例も次のことを行います。1。空の文字列のポインタをスタックにプッシュします(またはレジスタに書き込みます)。2.文字列クラスの新しいインスタンスを作成します(指定された文字列を使用)。3.新しく作成されたインスタンスのポインターをEAXに書き込みます(結果として)


申し訳ありませんが、これはC ++の質問ですが、C#について考えました:)

これは、文字列クラスのインスタンスが複製されることを意味します(ポインタによって返されることはありません)。とにかく、両方の例で文字列クラスのインスタンスが1つだけ作成され(1-暗黙的に、2-明示的に)、その結果、このインスタンス(一時オブジェクト)のすべてのバイトがスタックにプッシュされます。

答え:違いはなく、一時オブジェクトは1つだけです(コンパイラの最適化が適用されていない場合)。

注:どちらの場合も、コンパイラはスタックに同じバイト数を割り当てて文字列クラスのインスタンスを格納し、「」(空の文字列)はすでにメモリに格納されています(割り当てなし)。唯一の違いは、最初の例では文字列クラスのインスタンスが暗黙的に作成されることです。

于 2011-06-12T15:35:07.487 に答える