call by ~~

김대익·2022년 2월 24일
0

함수에 인수를 넘겨주는 방식

  • call by value
  • call by reference
  • call by pointer

    라고하면
    먼저 main에 대한 stack frame이 생성되면서 a = 0 int공간이 한번 만들어지고
    foo(a)를 위한 stack frame이 올라가게 된다.
    이 때 인수인 a가 들어오게되고 변수인 b를 가지고 있다
    a는 pass by value가 되면서 main의 값인 0이 복사되어 foo의 stack frame에 들어가게 되고
    local변수인 b는 1이 된다.


call by pointer의 경우 foo의 stack frame에 a의 주소가 들어있다.
b의 값을 얻기위해 ap가 가르키는 main의 a=0과 1을 더해 b값을 얻는다.

call by reference의 경우 call by pointer과 동일한데
이는 어셈블리 코드가 동일하기 때문이다.

하지만 포인터를 넘겨줘야할 경우를 제외하고는 레퍼런스로 넘겨주는게 좋은데
이는 포인터로 넘겨주면 버그를 일으킬 확률이 높아지기 때문이다.

또한 foo에서 main의 a를 재정의하지 않았다면
void fooR(const int & a)처럼 const를 붙여주어 더 안전한 코드를 만들 수 있다.
이렇게 붙여주고 foo에서 a = 100처럼 인수를 재정의한다면

에러가 나온다.


만약 object나 array같은 것을 넘겨준다면 call by reference, pointer가 더 좋은 선택인데,
call by value의 경우

object나 array부분이 복사되기때문에 효율적이지 못하기 때문이다.

0개의 댓글