2016-10-09 10 views
-1

私はC++でコピーエリシジョンについて読んでいました。そして、私はこのコピーelisionを使ってC++でSTLについて疑問を抱いていました。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) 
。それは、関数SCOに宣言された変数である vector<int>(なし参照)

return result;を返して次のように定義された

pe。

私はこれらのvectoresが位置するメモリアドレスを見ようとしていました。 出力:

==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)で同じメモリアドレスになることを考えていたために異なることを意味していコピー制作ですか?

この方法はコピーエリミッションですか?

  • :そうでない場合は、なぜコピーエリミッションですか?
  • はいの場合:実際にコピーエリジョンを実行していることをどのように知ることができますか?

そして重要な1:これはコピーの省略されていない場合は、それはそれを行うことは可能でしょうか? STLでコピーエリミッションを実行するためには何が必要ですか?

+1

この質問は、 "STL"(それが何を参照することになっているか)ではなく、ユーザー作成コードのコピーエリーションについてのコピーエリートではありません。 –

+2

ベクトル res = merge(arrA、arrB);を試してください。 –

+0

@SamVarshavchikありがとう!、それによると。コピー脱落は、delcarationが関数呼び出しと同じ行にある場合にのみ発生します。あれは正しいですか? – Miguel

答えて

1

コピーエリジョンの場合、最初に「コピー」を付ける必要があります。すなわち、resベクトルを戻り値からコピー構築する必要があります。
それ以外の場合は、割り当てが必要になります。これには、ベクターにあったものを取り除く必要があり、そのようなものは省略できません。

まだ移動割り当てであることに注意してください。欠点はあまりありません(memcheckでもテストできます)。

関連する問題