반응형
1. Pass by Value
a 가 Pass by Value 되며 카피되면서 foo 에 a=0 이 들어가게 되고,
로컬변수 b는 a+1이니까 1이 들어가게 된다.
결국 값이 복사가 되는 것.
2. Pass by Pointer
함수에서 매개변수로 포인터를 받게 되면, 이 포인터는 함수 바깥에 있는 변수에 접근 가능하다!
만약 예를 들어서, fooP() 에 *ap = 100 을 써주게 되면 어떻게 될까?
fooP가 동작할 때 a 공간에 접근을 해서 값을 100으로 바꿔주는 코드가 된다. (접근 가능!)
3. Call by Reference
레퍼런스를 받는 fooR() 함수를 만들어주고 콜 해 주는 코드를 짜 보자.
사실 포인터로 넘겨주는 함수와 레퍼런스로 넘겨주는 함수 두 개는 똑같다.
Compiler Explorer을 활용해서 어셈블리 코드를 확인해 보자.
어셈블리 코드를 확인해 보면 두 코드는 완벽하게 똑같은 것을 확인할 수 있다.
즉 레퍼런스를 넘겨주는 것은 위에서 설명한 포인터를 넘겨주는 것과 똑같은 방식으로 동작한다는 것이다.
4. 포인터와 레퍼런스 어떤 방식으로 넘겨주어야 할까?
포인터가 필요한 경우를 제외하고는 레퍼런스를 써 주면 된다.
포인터를 그대로 노출하게 되면 버그를 일으킬 확률이 높아지기 때문에 더 안전한 코드를 짜기 위해서는 레퍼런스를 쓰는 것이 좋다.
그리고 위의 코드에서 레퍼런스를 넘겨주었을 때 a를 재정의 하지 않았다.
a의 값을 fooP가 바꾸지 않았다는 것이니, 매개변수 앞에 const를 붙여주어 더 안전한 코드를 짤 수 있다.
만약 const를 앞에 붙이고 a를 재정의 하게 된다면, 컴파일 에러가 뜨기 때문이다.
*만약 위 코드들에서처럼 int형이 아닌 Cat과 같은 오브젝트나 사이즈가 큰 Array를 넘겨주었을 경우,
pass by value 하게 되면 함수 콜 했을 때 argument 부분이 엄청나게 커지면서 모두 복사가 되게 된다.
이 때 pass by pointer, reference를 하게 되면 간단하게 주소 정보만 가지고 있으면 그 object의 사이즈와 상관없이 간접적으로 접근이 가능하기 때문에 훨씬 더 효율적인 프로그램을 짤 수 있게 되는 것이다.
반응형
'모던C++ > Resource move' 카테고리의 다른 글
4. RVO - Return Value Optimization (0) | 2022.07.23 |
---|---|
3. std::move() 이해하기 - resource 최적화, 0 copy (0) | 2022.07.22 |
2. L-value, R-value - 0copy 만들기 (0) | 2022.07.21 |