5. Vector의 동적 크기 증가
Vector
배열 기반 컨테이너라 크기를 증가시키기 위해서 재할당이 필수
그래서 재할당 과정을 보면…
6. Vector의 동적 크기 증가
v a Int[1000]
1. 크기가 더 큰 새로운 Vector를 만든다
7. Vector의 동적 크기 증가
v a Int[1000]
2. 이곳에 기존 Vector에 있던 원소들을 모두 복사한다
(복사 생성자 호출, Deep Copy 발생)
Int[1000]
a
8. Vector의 동적 크기 증가
v
해제된 공간
3. 기존 벡터안에 있던 원소들을 모두 해제한다
(소멸자 호출)
Int[1000]
a
9. Vector의 동적 크기 증가
v
4. 새로운 벡터를 기존 벡터 이름에 연결한다
Int[1000]
a
10. Vector의 동적 크기 증가
1. createMyVec() 은 내부에서 임시로 비어있는 MyVec 객체를 하나 만들고 (vec2라 가정)
2. createMyVec() 함수 안에서 정의된 일을 수행한 후,
3. vec2를 vec 에 대입
3번 과정의 내부를 좀 더 들여다 봅시다.
3-1) createMyVec() 함수가 반환할 때 우선 넘겨받아야 할 vec 에 빈 자리가 있어야 하므로,
3-2) vec이 가지고 있던 엘리먼트들을 파괴합니다. vec 안에 무엇이 들어있던 간에 파괴됩니다.
3-3) vec 내부 확보가 끝나면, vec2 내의 엘리먼트를 vec 으로 하나 하나 복사합니다.
3-4) 복사를 모두 마치면, vec2는 소멸되어야 하므로, vec2 내부에 들어있는 엘리먼트를 파괴합니다.
3-5) vec2 의 엘리먼트들이 모두 소멸되고 난 후에, vec2를 소멸합니다
14. L-Value, R-Value?
C 표준에서는 이 둘을 아래와 같이 정의
An L-Value is an expression that may appear on the left or on the right hand side of an assi
gnment, whereas an R-Value is an expression that can only appear on the right hand side of
an assignment
대입식 (assignment)에서 왼쪽 또는 오른쪽에 나올 수 있는게 L-Value (left-hand side value의 약자)
오른쪽에만 나올 수 있는게 R-Value (right-hand side value의 약자)
15. L-Value, R-Value?
L-Value
어떤 값을 저장할 수 있고, & 연산자를 통해 해당 메모리의 주소값을 가져올 수 있는 표현식
R-Value
값을 저장할 수 없으며, L-Value 에 값을 저장하기 위해 임시로 생성된 표현식
& 연산자를 써서 주소값을 가져오는 것도 불가능
16. L-Value, R-Value?
C++에서 레퍼런스 타입을 반환하는 함수에 대한 호출은 L-Value를 반환하고,
이를 제외한 함수는 모두 R-Value를 반환
foo() 함수 호출은 L-Value를 반환하고, L-Value는 & 연산자를 통해 주소값을
가져올 수 있다
17. R-Value Reference?
L-Value 레퍼런스는 우측값으로 L-Value만 받을 수 있다
(const L-Value 레퍼런스는 L-Value, R-Value 둘 다 가능)
R-Value 레퍼런스는 우측값으로 R-Value만 받을 수 있다
36. MSDN R-Value Reference 부분을 보면…
The compiler treats a named rvalue reference as an lvalue and an unnamed
rvalue reference as an rvalue
컴파일러는 이름이 있는 R-Value Reference를 L-Value로, 이름이 없는 R-Value Ref
erence를 R-Value로 처리합니다.
R-Value Reference 처리
37. R-Value Reference 처리
f 함수에서 block은 named rvalue reference
따라서 함수 내부에서는 R-Value로 처리
f 함수는 unnamed rvalue reference를 리턴
왜인지는 저도 몰라요…
39. 하지만 템플릿을 사용하면 R-Value Reference에 L-Value를 대입할 수 있다
Argument Deduction
40. Argument Deduction
템플릿은 컴파일 타임에 함수를 생성
이 때 Argument Deduction(인자 추론)을 진행
그런 다음 컴파일러는 매개 변수 형식을 추론된 템플릿 인자로 대체할 때
reference collapsing rules를 적용
Argument Deduction
reference collapsing rules 적용
41. std::move
전달 인자가 L-Value면 _Ty&&이 L-Value Reference로 바뀌고
전달 인자가 R-Value면 함수 내부적으로 L-Value로 처리되기 때문에
타입 캐스팅을 해줘서 리턴
리턴한 이름없는 R-Value Reference를 R-Value로 사용