LR Value의 이해 - ① 함수 인자 전달
C++에서 함수에 인자를 넘겨주는 방법에는 3가지 방법이 존재.
- Pass by Value
- Pass by Pointer
- Pass by Reference
Pass by Value
함수 인자로 값을 넘겨주는 방식. 값에 대한 복사가 발생
void foo(int a)
{
int b = a + 1;
}
int main()
{
int a = 0;
foo(a);
return 0;
}
Pass by Pointer
함수 인자로 주소 값을 넘겨주는 방식. 인자로 넘겨받은 값을 포인터로 가리킬 수 있다.
void foo(int* ap)
{
int b = *ap + 1;
*ap = 100; // main 함수의 a에도 접근할 수 있다.
}
int main()
{
int a = 0;
foo(&a);
return 0;
}
Pass by Reference
함수 인자로 참조를 넘겨주는 방식. Pass by Pointer와 동일하게 동작한다.
void foo(int& a)
{
int b = a + 1;
a = 100; // main 함수의 a에도 접근 할 수 있다.
}
int main()
{
int a = 0;
foo(a);
return 0;
}
어셈블리 코드로 살펴보면 Pass by Pointer와 Pass by Reference는 완벽하게 동일함을 확인할 수 있다.
Pointer와 Reference 중 가급적 Reference를 사용하는 것이 좋다. Pointer를 그대로 노출시키게 되면 버그를 발생시킬 가능성이 더 높기 때문이다. 그리고 넘겨받은 인자를 수정하지 않을 것이라면 const를 붙여서 더욱 안전하게 코드를 작성할 수 있다.
void foo(const int& a)
{
int b = a + 1;
}
int main()
{
int a = 0;
foo(a);
return 0;
}
그리고 큰 오브젝트를 함수 인자로 전달할때는 Pass by value를 사용하면 큰 오브젝트에 대한 복사가 일어나면서 시간과 공간의 낭비가 발생한다. 오브젝트의 복사가 필요한 경우가 아니라면 반드시 Pass by Pointer 혹은 Pass by Reference를 사용하자.
출처: https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg