본문 바로가기

C, C++

함수 호출 규약

함수 호출 규약은 대표적으로 __stdcall, __cdecl이 있고 함수 리턴 타입과 이름 사이에 씁니다.

void __stdcall Func() {}

쓰지 않았을 때의 기본값은 __cdecl입니다.

 

함수를 동작하는 데는 내부적으로 스택을 정리하는 동작이 필요한데 이 동작을 __cdecl의 경우 함수를 호출하는 곳 바로 밑에 추가하고, __stdcall의 경우 함수 내부에서 추가됩니다.

void __cdecl Func1() { }

Func1();
//스택 정리
Func1();
//스택 정리
Func1();
//스택 정리


void __stdcall Func2() {
	//스택 정리 
} 

Func2();
Func2(); 
Func2();

Func1의 경우 3개의 코드가 추가되고, Func2의 경우 1개의 코드가 추가됩니다. Func1가 코드가 더 많으므로 컴파일 했을 때 프로그램의 속도는 같지만 크기가 아주 약간 더 커지게 됩니다.

 

프로그램의 크기가 어쨌든 작아지니까 __stdcall를 쓰는 것이 무조건 좋다고 생각할 수 있지만 __stdcall은 가변 인수 함수를 지원하지 않습니다.

 

기타 다른 호출 규약도 있지만 사용하지 않기 때문에 생략하겠습니다.

'C, C++' 카테고리의 다른 글

#define  (0) 2019.12.12
#include  (0) 2019.12.11
배열 포인터 함수 인수  (0) 2019.12.09
포인터 배열과 배열 포인터  (0) 2019.12.08
가변 인수 함수  (0) 2019.12.07