emplace() 를 쓰도록 하자!!
왜?
push_back() 은 벡터가 힙 위에 선언 되어 있으면 맨 끝에 하나를 더 넣는다
이 때, 새롭게 넣을 데이터가 L-value 면 copy, R-value 면 move 가 일어나게 된다. (C++11 이후부터)
(L, R- value 는 밑에 설명)
emplace_back() 역시 push 와 똑같지만,
emplace에서 추가할 오브젝트의 생성자 파라미터들을 넣어줄 경우엔
copy 나 move 를 통해 추가하는 것이 아니라 오브젝트 생성하면서 벡터에 바로 때려넣기 때문에 코스트가 없다.
L-value / R-value
string a = "bconfiden2";
string b = a;
"bconfiden2" 의 경우가 r-value 이고, a와 b는 l-value 이다.
r-value 는 한번 쓰고 다시 쓰지 않는 변수, l-value 는 callable 한 변수이다.
R-value 는 버려질 친구이기 때문에 굳이 복사할 필요 없이 move 시키는 것이고,
L-value 는 기존에 연결되어있던 친구가 사용할 수 있기 때문에 copy 해서 집어넣는 것이다.
이 때 l-value 를 r-value 로 변환시키는 함수가 있는데, std::move(L) 이다.
이렇게 변환시켜서 벡터에 push(emplace)_back() 할 경우 copy 가 아닌 move 시멘틱을 사용하기 떄문에 효율적이다.
string a = "bconfiden2";
string b = move(a); (R-value 가 된다)
스택에 있는 호출가능한 a 가 힙에 있는 bconfiden2 를 가리키고 있다
move(a) 에서 힙과의 연결이 끊기고,
b 가 끊겨있는 R-value 인 bconfiden2 를 가리킨다.
따라서 현재 a 에는 아무것도 연결되어있지 않은 string 변수이다.
대부분 프로그램에서 l-value 변수를 만드는데, 다시 사용할 경우가 없는 경우엔 r-value 로 만들어 사용하면 더 효율적이다
'STUDY > C++' 카테고리의 다른 글
[C++] 키워드 static (0) | 2020.05.26 |
---|---|
[C++] list 를 쓸까? (0) | 2020.05.22 |
[C++] 배열과 벡터? (0) | 2020.05.21 |
[C++] 헤더파일과 소스파일 (0) | 2020.05.17 |
[C++] vector : push_back() 의 시간복잡도는? (1) | 2020.05.10 |