C ++では関数の戻り値は、オブジェクトの問題があります

問題の説明

C ++プログラムでは、関数の戻り値は、対象となる関数自体の内部でローカル変数を返す、
または中間オブジェクト(匿名オブジェクト)を生成するのだろうか?

テストの後、異なるの勝利およびLinuxプラットフォームへの影響

コードは以下の通りです

//
// Created by YANHAI on 2019/5/28.
//
#include <iostream>
using namespace std;

class Test {
public:
    Test(const char *name)
    {
        this->name = name;
        printf("%s: 执行了构造函数, 我的地址是 %p\n", name, this);
    }

    Test(const Test &obj)
    {
        this->name = obj.name;
        printf("%s: 执行了拷贝构造函数,我的地址是 %p,拷贝来自%s %p\n",
               name.c_str(), this, obj.name.c_str(), &obj);
    }

    ~Test()
    {
        printf("%s: 执行了析构函数, 我的地址是 %p\n", name.c_str(), this);
    }

public:
    string name;
};

Test fun()
{
    Test t("我是在fun函数中创建的");
    printf("in fun: %p\n", &t);
    return t;
}

void test1()
{
    // 这里t1对象就是fun函数里面创建的?
    cout << "fun start.." << endl;
    Test t1 = fun();
    cout << "fun end.." << endl;
    t1.name = "我是在test函数中被创建的";
    printf("我是在test函数中被创建的对象,我的地址是: %p\n", &t1);
}

int main()
{
    cout << "--------test1 start ...-----" << endl;
    test1();
    cout << "--------test1 end ...-----" << endl;
    return 0;
}

テストプロセス

勝利のプラットフォームで

VS2019のコンパイルと実行を使用して

結果:

--------test1 start ...-----
fun start..
我是在fun函数中创建的: 执行了构造函数, 我的地址是 010FFAC4
in fun: 010FFAC4
我是在fun函数中创建的: 执行了拷贝构造函数,我的地址是 010FFBD4,拷贝来自我是在fun函数中创建的 010FFAC4
我是在fun函数中创建的: 执行了析构函数, 我的地址是 010FFAC4
fun end..
我是在test函数中被创建的对象,我的地址是: 010FFBD4
我是在test函数中被创建的: 执行了析构函数, 我的地址是 010FFBD4
--------test1 end ...-----

プロセスを説明します。

  1. 楽しい機能では、トンのオブジェクトが作成され、オブジェクトのコンストラクタ関数をt(トン・ターゲット・アドレス010FFAC4)を実施し
  2. 楽しい復帰機能が実行されると、オブジェクトはテストTMP = Tの実装に相当する匿名のコピーコンストラクタを実行し、匿名オブジェクトを生成し;(匿名TMPアドレス010FFBD4オブジェクト)
  3. 楽しい機能の実行が終了し、オブジェクトのローカル変数tが解放され、tはデストラクタオブジェクト、楽しい機能匿名オブジェクト(TMP)のリターンを(リターンアドレスが匿名オブジェクト010FFBD4である)を行っ
  4. TEST1機能において、オブジェクトは関数funの戻り値を使用して作成さt1は、それが(むしろコピーコンストラクタT1を実行するよりも、このような試験T1 =テスト(「XX」)を実行するために直接匿名オブジェクトTMP T1がオブジェクトになります;)アドレス(T1匿名オブジェクトは、オブジェクト・アドレス010FFBD4です)
  5. test1の機能が完了すると、オブジェクトはT1、T1行っデストラクタをリリースしています

Linuxプラットフォームで

G ++コンパイラを使用します

結果:

--------test1 start ...-----
fun start..
我是在fun函数中创建的: 执行了构造函数, 我的地址是 0x7ffe5a2488c0
in fun: 0x7ffe5a2488c0
fun end..
我是在test函数中被创建的对象,我的地址是: 0x7ffe5a2488c0
我是在test函数中被创建的: 执行了析构函数, 我的地址是 0x7ffe5a2488c0
--------test1 end ...-----

プロセスを説明します。

  1. 楽しい機能では、トンのオブジェクトが作成され、オブジェクトのコンストラクタ関数をt(トン・ターゲット・アドレス0x7ffe5a2488c0)を実施し
  2. 関数fun、無匿名オブジェクトが、オブジェクトの終わり(Tの0x7ffe5a2488c0リターンがオブジェクトアドレスです)トンを返さ
  3. 関数の戻り値が作成されるときTEST1関数において、T1オブジェクトは楽しみを使用し、それは物体Tが直接的に(むしろコピーコンストラクタT1を行うよりT1オブジェクトになる返し、そのようなテストT1を実行する=テスト(「XX」) ;)アドレス(T1 tはターゲットオブジェクトアドレス0x7ffe5a2488c0です)
  4. test1の機能が完了すると、オブジェクトはT1、T1行っデストラクタをリリースしています

結論

  1. Linuxプラットフォームでは、効率を改善し、より少ない匿名オブジェクトを生成しました
  2. オブジェクトのトンだけのオリジナル機能(寿命ローカル変数)内で楽しい、リターン機能が有効test1のままなので

おすすめ

転載: www.cnblogs.com/yanhai307/p/10935665.html