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

+ Recent posts