int a(int &a, int &b){
내용
}
int b(int *a, int *b){
내용
}
int a,b;
a(a,b);
b(&a,&b);
각 함수 내용은 같다고 할 때(포인터 관련 문법차이 제외)
컴파일되고나서 a랑 b함수 부분이 같다고 생각함? 둘다 일단 포인터를 사용하는건 맞음
하지만 a함수 쪽은 주소 변수를 받을 필요조차 없음. 컴파일 시간때 a함수쪽 인자는 바뀔 일이 없기때문에 실제로 컴파일 되고나면 함수의 인자는 상수처리 되고 어셈블리 레벨에서 보면 실제로 함수쪽에서의 사용을 위해 스택이나 레지스터로 주소변수를 넘기지않고 로더가 결정한 상수값이 바로 명령어에 들어가게됨(정적변수들 처럼)
처리할 코드가 더 적고 자원도 적게 소모하는거지, 주소를 참조하는 건 똑같지만.
그에 반해 포인터쪽은 일단 포인터를 한번 참조해서 진짜 값의 위치를 알아야하는 일종의 동적 과정이기때문에 로더가 결정 지을수 없기에 포인터 값을 가져오고 그 주소(동적)로 가는 과정이 추가됨
게다가 문법상으로 call by value처럼 포인터 값을 지역 스택 이나 레지스터로 받아야 하니 또 자원과 여기에 로드하는 비용이 추가되지(이건 뭐 컴파일러 설계에 따라 달라질 수 있음 최적화문제도 있고)
(내가 C++에서 포인터를 call by reference로 부를 수 있는지는 모르겠음. 안될 이유는 없음(포인터 자체는 정적변수니 로더가 정적주소를 로딩 타임에 결정할 수 있음), 뭐 된다면 int* &a? 로 할려나 모르겠다)
(참고로 보통 c에서 인자는 지역스택으로 받지만 이건 펑션콜 방식에 따라 다름)
내용
}
int b(int *a, int *b){
내용
}
int a,b;
a(a,b);
b(&a,&b);
각 함수 내용은 같다고 할 때(포인터 관련 문법차이 제외)
컴파일되고나서 a랑 b함수 부분이 같다고 생각함? 둘다 일단 포인터를 사용하는건 맞음
하지만 a함수 쪽은 주소 변수를 받을 필요조차 없음. 컴파일 시간때 a함수쪽 인자는 바뀔 일이 없기때문에 실제로 컴파일 되고나면 함수의 인자는 상수처리 되고 어셈블리 레벨에서 보면 실제로 함수쪽에서의 사용을 위해 스택이나 레지스터로 주소변수를 넘기지않고 로더가 결정한 상수값이 바로 명령어에 들어가게됨(정적변수들 처럼)
처리할 코드가 더 적고 자원도 적게 소모하는거지, 주소를 참조하는 건 똑같지만.
그에 반해 포인터쪽은 일단 포인터를 한번 참조해서 진짜 값의 위치를 알아야하는 일종의 동적 과정이기때문에 로더가 결정 지을수 없기에 포인터 값을 가져오고 그 주소(동적)로 가는 과정이 추가됨
게다가 문법상으로 call by value처럼 포인터 값을 지역 스택 이나 레지스터로 받아야 하니 또 자원과 여기에 로드하는 비용이 추가되지(이건 뭐 컴파일러 설계에 따라 달라질 수 있음 최적화문제도 있고)
(내가 C++에서 포인터를 call by reference로 부를 수 있는지는 모르겠음. 안될 이유는 없음(포인터 자체는 정적변수니 로더가 정적주소를 로딩 타임에 결정할 수 있음), 뭐 된다면 int* &a? 로 할려나 모르겠다)
(참고로 보통 c에서 인자는 지역스택으로 받지만 이건 펑션콜 방식에 따라 다름)
뭔가 예시가 이상한데. a함수는 사용가능한게 아니지 않음?
수정 - 처음에 둘다 포인터를 사용한다고 했는데 내가 그 뒤에 스스로 부정하듯이 포인터를 사용하는게 아니라 둘다 윗 지역의 공간을 사용하는 방법이란거
왜?
포인터 자체에 대한 얘기는 알겠는데, 어셈블리 레벨이 아니라 C코딩 그자체로는 비교가 안되지 않나? 애초에 int &a 자체가 문법이 됨? 된다고 한들 주소를 안 넘기는데?
아니, 하긴 C자체에는 call by reference가 없다고 했으니 당연한거긴 하지만...
언어는 C 임
씨플플임 플러스기호가안되네
C에선 call by reference 있지도않음
a 함수에 Runtime-Allocated 된 int 타입의 4바이트 정수 값을 캐스팅하여 넘기면 어떻게되나요
아 씨플플이네... 씨라고 하길래 흠칫..
C++에서는 a함수가 되는거였네. C는 많이 써봤는데, C++ 많이는 안써봐서...
http://ideone.com/ocaFWO
VBA같은건 call by reference가 기본이길래, 혹시나 C++도 그런가 싶어서 해봤는데 C++은 call by value가 기본 맞구나.
근데 보통 포인터 안쓸거면, 혹시나 싶어서 따로 받아써서, 여태 int &a 같은게 가능한 줄도 몰랐네. ㅋㅋㅋ
말하려는바는 알겠는데 언어명세쪽 개념을 특정구현체로 설명하면 안됨. 어떤 컴파일러가 레퍼런스를 포인터로 닥컨버전해서 다룬다 해도 명세에만 맞으면 맞는 컴파일러고 이런 컴파일러 쓴다고 해서 개념이 바뀌는건 아니니깐.(뭐 그 개념을 통해서 이러이러한 최적화 전략이 가능하다는식이면 몰라도, 그 개념이 다른 이유는 다른 구현전략을 사용하기때문 이런건 말이 안됨.)
중딩3/call by reference는 당연히 정적변수로만 바인딩할수있음(포인터로 따지면 포인터상수) 안되지 당연히
오 님 고수네요 ^^ 과외가능한가요?