2

コンストラクターが呼び出される状況についての理解を深める必要がありました。この間、Microsoft の次の例に出くわしました。

//RVO class is defined above in figure 4
#include <stdio.h>
RVO MyMethod (int i)
{
            RVO rvo;
            rvo.mem_var = i;
            throw "I am throwing an exception!";
            return (rvo);
}
int main()
{
            RVO rvo;
            try 
            {
                        rvo=MyMethod(5);
            }
            catch (char* str)
            {
                        printf ("I caught the exception\n");
            }
}

このRVOクラスには、コンストラクタ、copyconsdtuctor、およびデストラクタが呼び出されたときに表示されるだけです。Microsoft は、thorw がコメントアウトされ、NRVO がない場合、出力は次のようになると述べています。

I am in constructor
I am in constructor
I am in copy constructor
I am in destructor
I am in destructor
I am in destructor

でもなかなか追いつけない。私はこれが起こると思います:

  1. constructorに求められるのはRVO rvo;
  2. In MyMethodconstructorが呼び出されますRVO rvo;
  3. return (rvo);copyconstructor呼ばれるため
  4. In MyMethoddestructorは、ローカル RVO に対して呼び出されます
  5. In Maindestructorはローカル rvo に対して呼び出されます

destructorこれにより、Microsoft が宣言しているよりも 1 回少ない呼び出しで済みます。私は何が欠けていますか?

完全を期すために、RVOクラス:

class RVO
{
public:

            RVO(){printf("I am in constructor\n");}
            RVO (const RVO& c_RVO) {printf ("I am in copy constructor\n");}
            ~RVO(){printf ("I am in destructor\n");}
            int mem_var;       
};
4

4 に答える 4

1

ステートメント rvo=MyMethod(5); を注意深く見ると、

rvo は MyMethod の戻りオブジェクトによって割り当てられるため、戻りオブジェクトはメイン関数のスコープ内で構築する必要があります。このオブジェクトには名前がなく、一時的なオブジェクトです。そのようなオブジェクトのコンストラクターは出力に表示されますが、一見しただけではわかりません。

于 2012-09-19T06:58:36.050 に答える
1

混乱しないでください。戻り値の最適化を行わないと、3 つの) オブジェクトが作成され (コピー コンストラクターによるコピーに使用される一時オブジェクトを含む)、したがって3 つのオブジェクトが破棄されます (一時オブジェクトをもう一度含む)。

ただし、RVO では、コピー中に一時オブジェクトは作成されず (オブジェクトは呼び出し元のスタック フレームに直接作成されます)、2 つの構築と 2 つの破棄のみが表示されます。

于 2012-09-19T06:55:33.863 に答える
0

rvo は main() で構築されます

rvo は MyMethod で構築されます

名前のない RVO オブジェクトは、return ステートメントによって MyMethod の rvo からコピー構築されます。

3 つのオブジェクトはすべて破壊されます

于 2012-09-19T06:55:39.773 に答える
0

「メイン コンストラクターでは RVO rvo に対して呼び出されます。MyMethod では、RVO rvo に対してコンストラクターが呼び出されます。リターン (rvo) に対しては、コピー コンストラクター」 したがって、3 つのオブジェクトが構築され、通常の状況では 3 つのオブジェクトが破棄されます。戻り値も破棄する必要があります。

于 2012-09-19T06:56:08.930 に答える