728x90

 0. [c++] 시스템프로그래밍 - 

 

https://www.acmicpc.net/problem/ 

 

 1. 풀이

1.    함수 앞에 WINAPI가 있을 때와 없을 때의 차이점에 대해 설명하세요.

WINAPI

WINAPI가 함수 앞에 존재하는 경우 __stdcall이 선언된 것과 같은 의미이다.

이에 대해 차이를 비교해보자.

 

함수 호출 비교

함수 호출을 보면 WINAPI를 활용하지 않은 경우 add 구문이 추가적으로 있는 것을 볼 수 있다.

함수 내부 비교(__stdcall)

함수 내부 비교(__cdecl)

함수 내부를 보면 최종적인 ret이 다른 부분 외에는 모두 일치함을 볼 수 있다.

 

이러한 차이는 __stdcall과 __cdecl 호출의 차이로 볼 수 있다.

__cdecl은 기본적으로 visual studio에서 함수를 호출할 때 활용하는 기본 규정이다. 둘 다 모두 스택을 활용해 런타임 중 자동할당하는 방식이다.

허나 차이가 있는데, __cdecl은 추가적으로 "add esp, 8" 이 존재하는 것을 볼 수 있고, __stdcall의 경우 이것이 존재하지 않는 차이가 있다.

이를 확실히 알기 위해서는 esp(extended stack pointer)에 대해 알 필요가 있는데, 현재 스택에서 어떤 부분이 진행되는지 지시하는 포인터이다.

1) __stdcall

우리가 코드를 수행하며 함수를 만나게 되면 함수를 호출하게 된다.

이후 함수에서 stack 영역에 연산을 위한 데이터 공간을 자체적으로 push하고, 함수를 종료하기 전에 할당한 공간을 pop 하는 방식이 __stdcall 방식이다.

 

2) __cdecl

__cdecl 방식은 함수를 호출하기 이전에 Stack 영역을 미리 push 하고, 함수를 종료한 이후에 미리 선언된 공간만큼 pop을 하는 방식이라 볼 수 있다.

현재 코드를 보면

다음과 같이 함수가 종료된 이후 esp 포인터를 int 2개분 만큼 더해주어서 Stack의 포인터를 원래 상태로 돌려주는 것 이다.

stackoverflow.com/questions/3404372/stdcall-and-cdecl

 

stdcall and cdecl

There are (among others) two types of calling conventions - stdcall and cdecl. I have few questions on them: When a cdecl function is called, how does a caller know if it should free up the stack ...

stackoverflow.com

두개의 차이를 더 자세히 알아보기 위해서 글을 읽어보게 되었다. 두개의 속도는 어느 한 쪽이 빠르다고 할 수 있다고 한다. 더 빠른 성능을 원한다면 FASTCALL을 활용하면 processor registers를 더 확장해 활용하는 것으로 더 빠른 속도를 얻을 수 있다고 한다.

그래서 핵심적인 부분은 실제로 더 자세하게 코드를 만들기 위해서 이러한 세부적인 부분도 이해할 필요가 있다는 것을 느낄 수 있었다.

현재 컴퓨터를 활용해서 간단한 코드를 작성하는 지금 수준에서는 문제가 발생하지 않지만, 이후 스택 영역을 관리하며 코딩을 하는 경우가 생길 때, 내가 작성한 코드가 정상적으로 동작하지 않고 문제가 발생하는 경우가 생긴다면, cross complie 과정에서 함수 호출이 __stdcall인지 __cdecl인지, 아니면 아예 새로운 방법일지도 이해해야 한다는 것을 알 수 있었다.

 

 

 

2. 소스코드

#include <windows.h>
int sum(int x, const int& y);
int WINAPI wsum(int x, int y);
void main() {
	int a, b, c;
	a = 10;
	b = 20;
//	c = a + b;
	c = sum(a, b);
	c = wsum(a, b);
}
int sum(int x, const int& y) {
	int z;
	z = x + y;
	return z;
}
int WINAPI wsum(int x, int y) { //모든 Windows API는 WINAPI 형식의 함수이다.
	int z;
	z = x + y;
	return z;
}

 3. 참고

stackoverflow.com/questions/3404372/stdcall-and-cdecl

질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!

+ Recent posts