본문 바로가기

함수3

(C++)함수 호출 규약 함수 호출 규약은 함수 호출 시 전달되는 인자의 순서나 함수가 종료될 때 함수의 스택을 정리하는 시점 등을 약속한 것이다. 대표적인 함수 호출 규약으로 stdcall, thiscall, fastcall 등이 있다. 기본 정적 함수 호출규약은 cdecl이고 멤버함수는 thiscall을 사용한다. cdecl, stdcall, fastcall 이 3가지 함수 호출 규약을 비교해 보도록 하겠다. cdecl stdcall fastcall 인수 호출 방향 오른쪽 -> 왼쪽 오른쪽 -> 왼쪽 오른쪽 -> 왼쪽 인수 전달 매체 스택 스택 레지스터와 스택 스택프레임 정리 주체 호출자 호출 받는쪽 호출받는쪽 cdecl의 경우 c와 c++의 표준 규약이고 printf와 같은 가변인자를 받기 위해 만들어졌다. 가변인자이기에 .. 2020. 7. 13.
(C++)함수 포인터와 콜백함수 함수 역시 메모리의 시작 주소값을 가진다. 그래서 변수처럼 함수의 주소값을 가지는 포인터를 가질 수 있는데 이를 함수포인터 라고한다. int Function(int a) { printf("%d", a); return a; } int main() { //함수 포인터 생성 int(*Fp)(int); //포인터에 함수 대입 Fp = Function; //함수 호출 Fp(10); (*Fp)(10); } 위의 코드와 다르게 함수가 어떤 클래스의 멤버함수인 경우엔 void (FClass::*Fp)(int)처럼 선언한다. 함수포인터를 이용한 콜백 메커니즘 대표적인 콜백함수를 구현하는 방식으로 함수포인터를 넘겨주는 방법이 있다. //클라1 void Print1(int n) { cout 2020. 7. 13.
(C++)VS에서 함수에서 지역변수의 레퍼런스값 리턴시 접근할수 있는 이유 int& Rf() { int a1 = 3; int& A1 = a1; printf("%d", A1); return A1; } int main() { int& a=Rf(); a = 3; printf("%d", a); } 위의 코드와 같이 Rf함수에서 지역변수의 참조인 A1을 리턴하여 main함수에서의 참조자a에 저장하였다. 원래대로라면 지역변수 A1이 가리키는 a1은 함수 Rf의 스코프가 종료될때 해제되고 접근이 불가능해야 정상일것이다. 하지만 위의 코드는 잘 동작한다. a를 바꾸는것은 물론이고 main과 Rf에서의 변수의 주소값이 동일하게 나온다. 왜 이것이 가능한지 나는 궁금했고 결과적으로 말하면 정확한 원인은 밝혀내지 못했다. 하지만 조사했던 부분을 한번 포스팅해보고자 한다. int& Rf() { in.. 2020. 6. 29.