[정보]
C++ pair 리턴할 때 주의점
익명(skuld88)
2022-07-19 16:23
추천 0
C++ std::pair<std::vector<int>, int> 같은 걸 리턴할 때 pair의 first에 std::move를 안 붙여주면 복사가 일어납니다!
올드하게 std::make_pair로 리턴하든 {} 문법으로 리턴하든 마찬가지입니다.
예제 코드:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std
;
struct Vector {
vector
<int> v
;
Vector() = default;
Vector(const Vector
& other
) : v
{other
.v
} {
cout
<< "Copy ctorn";
}
Vector
& operator=(const Vector
& other
) {
Vector V
{other
};
swap(*this, V
);
cout
<< "Copy asgnn";
return *this;
}
Vector(Vector
&& other
) noexcept : v
{move(other
.v
)} {
cout
<< "Move ctorn";
}
Vector
& operator=(Vector
&& other
) noexcept {
Vector V
{move(other
)};
swap(*this, V
);
cout
<< "Move asgnn";
return *this;
}
};
pair
<Vector
, int> func() {
cout
<< "func()n";
Vector V
;
V
.v
.push_back(1);
V
.v
.push_back(2);
return {V
, 1};
}
pair
<Vector
, int> func2() {
cout
<< "func2()n";
Vector V
;
V
.v
.push_back(1);
V
.v
.push_back(2);
return {move(V
), 1};
}
int main() {
func();
func2();
}
실행 결과 (https://wandbox.org/permlink/QqO3vdJOoEd8JGAn)
func()
Copy ctor
func2()
Move ctor
이걸로 데여본 분들은 다 명심하게 되는 사항이지만,
초심자 분들은 pair 쓸때 주의합시다.
지역 변수에 pair로 만들어서 nrvo되는게 더 좋을듯
{}로 리턴했는데 복사되면 정신나가겠네 ㅋㅋ
{} 문법이라는건 뭐임? implicit construction 말하는거림? - dc App
이거는 pair의 문제가 아니지 않음? 이미 따로 생성된 Vector 로컬 객체를 새로운 객체 만드는데 다시 이용하는 과정인데 std::move 안하면 pair든 뭐든 복사지
그렇죠. 그런데 코드리뷰에 꽤 자주 올라오는 실수라서
얼핏 보기에 pair가 생성되기 전에 일어나는 복사를 pair가 생성 이후에 일어날 수 있는 복사/이동 과정과 혼동하고 글쓴거 같음