7

プログラムがある場合:

#include <iostream>

using namespace std;

int TestIntReturn(int &x, int &y)
{
    x = 1000;
    y = 1000;
    return x+y;
}

int main()
{
    int a = 1;
    int b = 2;
    cout << a << " " << b << endl;
    TestIntReturn(a,b);
    cout << a << " " << b << endl;
}

TestInReturn(a,b)未使用なのでの戻り値はどうなりますか?

4

7 に答える 7

11

Windowsについて話しているので、x86プロセッサを想定します。

この場合、戻り値は通常、レジスタEAXにあります。使用していないため、その値は単に無視され、次にEAXに何かを書き込むコードが実行されたときに上書きされます。

多くの場合、関数に他の副作用がない場合(入力を受け取り、結果を返すだけ)、コンパイラは結果を使用していないことを認識し、関数を呼び出さないことができます。

あなたの場合、関数にはいくつかの副作用があるため、それらの副作用を実行する必要がありますが、合計を計算するためのコードを削除することもできます。省略されていなくても、追加されているのは実際には2つの定数であることがわかるため、実行時に結果を実際に計算することはなくmov EAX, 2000、戻り値を生成するようなことを行うだけです。価値。

于 2013-02-26T18:33:06.293 に答える
9

破棄されます; 式TestInReturn(a,b)破棄された値の式です。を破棄しintても効果はありませんが、volatile int(またはその他の揮発性修飾タイプ)を破棄すると、メモリから読み取る効果があります。

于 2013-02-26T18:30:02.857 に答える
4

戻り値は単に破棄されます。正確なシナリオに応じて、観察可能な副作用がない場合、オプティマイザーは関数呼び出し全体を最適化することを決定する場合があります(これはあなたの例では当てはまりません)。

したがって、から戻るTestIntReturnと、関数はスタックに戻り値をプッシュし、呼び出し元はそれに応じてスタックフレームを調整しますが、スタックからの戻り値を変数にコピーしません。

于 2013-02-26T18:28:56.900 に答える
0

プリミティブ型の場合、何も起こりません。無視されます。クラスタイプの場合、返されたオブジェクトは、他に何も起こらずに破棄されます。

于 2013-02-26T19:34:14.770 に答える
0

何もありません-それはエーテルに入り、保存/使用されません。戻り値自体は右辺値または一時値です。コンパイラは、実際には使用されていないため、一時的な作成でも最適化すると思います。

于 2013-02-26T18:29:19.803 に答える
0

戻り値はスタックに格納され、関数が戻るときにポップオフされます。呼び出し元によって変数に割り当てられていないため、スタックがポップされたときに破棄されます。

于 2013-02-26T18:30:25.997 に答える
0

誰もが正しく答えました-この場合の戻り値は単に破棄され、この特定の例では無視できます。

ただし、戻り値が関数内で割り当てられたメモリへのポインタであり、それを無視すると、メモリリークが発生します。

したがって、無視できない関数値もありますが、この場合は無視できます。

于 2013-02-26T18:54:14.440 に答える