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에서 사본 추출을 수행하는 데 필요한 것은 무엇입니까?
이 질문은 "STL"의 복사 방지에 대한 내용이 아니라 사용자 작성 코드의 복사 방지에 관한 내용입니다. –
'벡터 res = merge (arrA, arrB);'를 시도해보십시오. –
@SamVarshavchik 감사합니다!, 그에 따르면. copy-elision은 delcaration이 함수 호출과 같은 줄에있는 경우에만 발생합니다. 그 맞습니까? – Miguel