본문 바로가기
언어/C++

(C++)함수 호출 규약

by 흥부와놀자 2020. 7. 13.

함수 호출 규약은 함수 호출 시 전달되는 인자의 순서나 함수가 종료될 때 함수의 스택을 정리하는 시점 등을 약속한 것이다. 대표적인 함수 호출 규약으로 stdcall, thiscall, fastcall 등이 있다. 기본 정적 함수 호출규약은 cdecl이고 멤버함수는 thiscall을 사용한다. 

cdecl, stdcall, fastcall 이 3가지 함수 호출 규약을 비교해 보도록 하겠다.

  cdecl stdcall fastcall
인수 호출 방향 오른쪽 -> 왼쪽 오른쪽 -> 왼쪽 오른쪽 -> 왼쪽
인수 전달 매체 스택 스택 레지스터와 스택
스택프레임 정리 주체 호출자 호출 받는쪽 호출받는쪽

cdecl의 경우 c와 c++의 표준 규약이고 printf와 같은 가변인자를 받기 위해 만들어졌다. 가변인자이기에 함수 스스로 스택을 정리하는게 아닌 호출하는 곳에서 함수의 스택프레임을 정리해 준다. 

 

stdcall은 Windows API의 표준 규약이다. Windows API에서는 가변인자가 아닌 고정인자만 받으므로 호출받는 쪽(Callee)가 스스로 스택을 정리한다. 

 

fastcall은 두개의 인자는 레지스터로 전달하여 사용하고 3개부터는 스택을 같이 사용한다. 그렇기에 이름처럼 조금 더 빠른 속도를 갖는다.

'언어 > C++' 카테고리의 다른 글

(C++)STL  (0) 2020.09.14
(C++) 템플릿  (0) 2020.09.14
(C++)함수 포인터와 콜백함수  (0) 2020.07.13
(C++)타입변환 연산자 오버로딩  (0) 2020.07.02
(C++)연산자 오버로딩의 활용  (0) 2020.06.29