티스토리 뷰
C++11에서 가장 큰 변화라하면 move semantics이라 말할 수 있다. move semantic은 r-value(오른값)에 근거해서 사용한다. 하지만 대학교를 이제 졸업해 c++11을 처음 접하게 되면 전혀 와닿지가 않는다. 이렇게 move를 처음 접하는 독자들을 위해 해당 포스트에서는 move를 이해하는데 초점을 맞출것이다.
정의
r-value
r-value 오른값은 말 그대로 오른쪽에 있는 값을 의미한다. 오른값의 반대는 왼값이다.
a = 10;
위에 a = 10에서 왼값은 a이고 오른값은 10이다. 둘의 차이점을 살펴보면 왼값의 경우는 소멸시키기전까지는 사라지지 않는다. 반면에 오른값은 a에게 10을 할당하고 사라지게 된다. 오른값이 사라지는 이유는 10은 어떤 변수도 담고 있지 않은 숫자에 불과하기 때문이다. 그런데 오른값이 변수라고 생각해보자.
int b = 10;
int a = b;
...
2번째 줄 a = b에서 a는 왼값, b는 오른값이라고 생각이 들 수 있다. 하지만 b는 오른값이 아니다. 그 이유는 b는 2번 라인 이후에 사라지지 않기 때문이다.
Move semantics
move semantics은 이동 의미론이라고 불린다. 객체를 사용하는 예제를 보자.
Object b = new Object();
Object a = b; // Object b(a)
a = b에서 우리가 원하는 결과는 b를 a로 복사하는 것이다. 실제로도 a는 b를 깊은복사(주소값도 독립적인 복사)를 통해 복사할 것이다. 그런데 b는 10(a = 10에서의 10)과 다르게 사라지지 않는다. b는 변수로 선언되었기 때문이다.
그런데 만약 b가 3번째 줄 이후에 사용되지 않고, 2번째 줄에서 자기 역할이 다 끝났다고 생각해보자. 그렇다면 굳이 a가 비용이 비싼 b를 깊은 복사할 필요가 있을까?
이런 경우에 a가 b를 복사하지 않고 b를 소유한다고 생각해보자. 이때의 장점은 다음과 같다.
- b를 소멸 시킬 필요가 없다.
- a에 새로 메모리를 할당하지 않아도 된다.
- 생성자를 다시 호출하지 않아도 된다. 낭비되는 메모리와 시간을 줄일 수 있다.
이렇게 소유권을 이동시키는 경우 많은 장점들이 있다. 이처럼 소유권을 이동시키는 것을 Move semantics라고 한다.
move()
위에서 이야기한 소유권을 이동시켜주는 함수가 move() 함수이다. 컴파일러에게 이 객체는 오른값이야라고 알려주는 것이다. 사용법은 다음과 같다.
Object b = new Object();
Object a = move(b);
...
위와 같이 사용하게 되면 b의 소유권은 a로 전달된다. a는 b를 가져왔기 때문에 생성자를 호출할 필요도 없고 b는 소멸자를 호출할 필요도 없다. 대신 구현에 따라 다르겠지만 일반적으로 이동생성자가 호출된다. (move를 사용하지 않으면 복사생성자를 호출할 것이다)
'C++' 카테고리의 다른 글
[C++] call by reference (0) | 2019.07.05 |
---|---|
[C++] struct와 class (0) | 2019.06.26 |
[C++] 헷갈리기 쉬운 포인터 변수의 소멸조건 (0) | 2019.04.30 |
[C++] namespace 란 무엇인가? (0) | 2019.04.21 |
- Total
- Today
- Yesterday
- 다이소
- const
- async
- auto
- Perfect
- Effective Modern C++
- 보편 참조
- 포인터
- thread
- 보편참조
- C++
- Effective
- Modern
- C
- Overloading
- CPP
- 람다
- Join
- MOVE
- 발아시기
- Forwarding
- std::move
- Override
- std::forward
- C++14
- Unreal
- Future
- C++11
- detach
- forward
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |