'COM'에 해당되는 글 1건

  1. 2009.10.04 COM 함수들은 왜 __cdecl 대신 __stdcall를 쓰는가?
대개 COM 관련된 내용을 검색하면 그저 표준호출(__stdcall)을 사용하라고 써있을 뿐 그 이유에 대해서는 적혀있지 않다.
(마소의 MSDN에서도 찾아볼 수 없는 내용이라 그런지도 모른다 - 어쩌면 나만 못 찾은 것일지도)

안타까운 일이라고 생각된다.




단순하게 얘기하자면 COM 함수의 원형이 그렇게 만들어져 있으니 공부를 위해선 맞춰가는 수밖에 없지 않겠느냐고

할 수 있겠지만 맥빠지는 이야기다.

C의 기본 호출은 __cdecl이며 해당 함수를 호출하는 쪽(호출원)이 인자 크기만큼의 메모리를 회수한다(스택 이야기).

함수를 완전한 독립된 개체라기보다 하나의 강력한 반복문 정도로 취급하는 것이며 C가 탄생할 때의 배경과 어울린다.

반면 C++의 기본 호출은 여러 가지 이유에서 __stdcall이며 이는 함수 쪽에서 스스로 스택을 정리한다.

메모리 관리 면에서 보자면 독립성과 일종의 캡슐화를 갖춘 셈이고 진보된 방법임은 분명하다. 다만 이것은 메모리 측면의

이야기일 뿐이며 기법 면에서 보자면 가변 인수를 사용할 수 없는 등의 약점이 있다.



COM은 OOP의 개념으로 탄생한 기술이고 따라서 C 호출방식보다 표준호출을 선택한 것 같다.

가변 인자를 사용하지 않는다면, 미미하긴 하지만 C 호출방식보다는 표준호출이 어셈블리 코드에서 조금 더 유리하다.
(C 호출방식은 함수를 여러번 호출하면 그때마다 메모리 회수 코드를 작성해야하므로 그만큼 줄 수가 늘어난다)



COM 함수를 직접 재정의하는 경우가 아닌 이상 일반 함수들도 무조건 표준호출을 할 필요가 없음을 알리기 위해 몇 자 적어보았다.
Posted by OOJJRS
,