2016-10-09 2 views
-1

C++의 복사 elision에 대해 읽었습니다. 그리고 난이 복사 elision을 사용하여 C + +에서 STL에 대한 의문을 가지고있었습니다.STL을 사용한 복사 elision (벡터 예제)

다음 코드 :

#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;는 함수 SCO에서 선언 된 변수와

체육.

이 벡터가 위치한 메모리 주소를 확인하려고했습니다. 출력 :

==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에서 사본 추출을 수행하는 데 필요한 것은 무엇입니까?

+1

이 질문은 "STL"의 복사 방지에 대한 내용이 아니라 사용자 작성 코드의 복사 방지에 관한 내용입니다. –

+2

'벡터 res = merge (arrA, arrB);'를 시도해보십시오. –

+0

@SamVarshavchik 감사합니다!, 그에 따르면. copy-elision은 delcaration이 함수 호출과 같은 줄에있는 경우에만 발생합니다. 그 맞습니까? – Miguel

답변

1

복사 elision의 경우 첫 번째 위치에 "복사"가 있어야합니다. 즉, res 벡터가 반환 값에서 복사 생성되어야합니다.
그렇지 않으면 벡터에있는 것이 무엇 이던지 없애고 생략 할 수 있어야하는 과제가 생깁니다.

여전히 이동 할당이므로 결점은 그리 많지 않습니다 (memcheck로 테스트 할 수도 있음).