1

私はC ++のコピー省略について読んでいました。そして、このコピー省略を使用した C++ の STL について疑問を持っていました。

次のコード:

#include <vector>
#include <iostream>
using namespace std;

vector<int> merge(vector<int> &arrA, vector<int> &arrB)
{
    int x;
    vector<int> result;

    for(x = 0; x < arrA.size(); x++)
    {
        result.push_back(arrA[x]);
    }
    for(x = 0; x < arrB.size(); x++)
    {
        result.push_back(arrB[x]);
    }
    cout << "fun return: " << &result <<endl;
    return result;
}


int main(int argc, char const *argv[])
{
    vector<int> arrA;
    arrA.push_back(1);
    vector<int> arrB;
    arrB.push_back(2);
    vector<int> res;

    res = merge(arrA, arrB);
    cout << "return: "  << &res <<endl;

    return 0;
}

そのため、ベクトル A と B を単純なタスク (マージ) を行っていました (プロセスには注意を払わず、関数だけに注意して戻ります。

vector<int> merge(vector<int> &arrA, vector<int> &arrB)

vector<int>次の定義では、 (参照なし)を返しています

またreturn result;、関数スコープで宣言された変数です。

これらのベクトルが配置されているメモリアドレスを確認しようとしていました。出力:

==5036== Memcheck, a memory error detector
==5036== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==5036== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==5036== Command: ./a.out
==5036== 
fun return: 0xffefffe40
return: 0xffefffe20
==5036== 
==5036== HEAP SUMMARY:
==5036==     in use at exit: 0 bytes in 0 blocks
==5036==   total heap usage: 5 allocs, 5 frees, 28 bytes allocated
==5036== 
==5036== All heap blocks were freed -- no leaks are possible
==5036== 
==5036== For counts of detected and suppressed errors, rerun with: -v
==5036== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

どちらもメモリアドレスが違うので、コピーコンストラクタにしない限り最後は同じメモリアドレス(0xffefffe40)になると思っていたのですが、コピー構築ということでしょうか?

このメソッドはコピー省略ですか?

  • そうでない場合:なぜコピー省略ではないのですか?
  • はいの場合: 本当にコピー省略を行っていることをどのように知ることができますか?

そして重要なことは、これがコピー省略ではない場合、それを行うことは可能ですか? STLでコピー省略を行うには何が必要ですか?

4

1 に答える 1

1

コピー省略の場合、最初に「コピー」が必要です。つまり、resベクトルは戻り値からコピー構築する必要があります。
それ以外の場合は、ベクトルに含まれていたものをすべて削除する必要があるため、省略できません。

これはまだ移動割り当てであるため、欠点はそれほど大きくないことに注意してください (memcheck でもテストできます)。

于 2016-10-09T03:30:53.360 に答える