Programming/C language

Chapter 17. 함수에 대한 고급이론

Moomyung 2017. 7. 5. 15:01

성능 향상을 위한 이론 


함수 호출에는 비용이 필요하다. 따라서 아주 간단한 작업을 함수로 만드는 것은 비효율적이다. 


하지만 간단한 작업이 자주 반복되는 경우가 있는데, 이러한 경우 과거 macro를 사용했고, 현재는 Compile 최적화로 __inline 함수를 사용한다. 



함수 호출 규칙 (Calling convention)


호출자 함수가 피호출자 함수를 호출하는 과정에서 매개변수를 전달하는 순서 및 매개 변수가 사용한 메모리 관리 방법 등에 대한 규칙 


__cdecl : 매개변수 오른쪽부터 stack에 push

 매개변수로 인해 증가한 stack caller가 정리 


__stdcall : 매개변수 오른쪽부터 stack에 push

  stack을 callee가 정리 


__fastcall : 매개변수중 가장 왼쪽 첫 번째, 두 번째를 Register에 저장 (EDX, ECX)



함수 포인터와 역호출 구조


함수포인터

함수의 이름도 배열의 이름처럼 '주소 상수'이다. 그러므로 포인터 변수에 저장이 가능하다. 


반환 자료형 (호출규칙 *변수이름) (매개변수) 


역 호출구조 

함수호출 연산자/함수 포인터가 필요한 경우 

- 동적 연결 라이브러리 (DLL)

- 역호출 구조를 구현 


내가 함수를 호출하는 것이 아니라 다른 무엇에 의해 호출되는 구조 


ex) qsort() 


내가 호출하는 피호출자 함수에게 함수의 주소를 '등록'해주면 피호출자에 의해 "자동으로 호출된다."


함수 포인터 + Look up 배열을 사용해 Switch-case를 대체가능 (높은 성능)



Static Library

함수를 만들어 놓고 다른 code에서 쉽게 사용할 수 있게 하는 것 (공구상자)  


lib 파일을 만든다. <- 함수의 정의만 존재한다. 


lib 파일의 선언부가 존재하는 파일을 #include 를 사용해서 호출한다. 


#pragma comment (lib, "lib경로") 를 넣어 사용한다. 


충돌 원인

- lib의 함수 이름 

- 가령 socket을 사용한다고 할 때, 여러 lib에서 소켓 해제, 생성의 순서가 뒤바뀐 경우 


단점 

exe file의 크기가 커진다. 

lib를 고치면 모든 exe를 새로 linking 해야한다. 





연습문제) 


1) C/C++ 언어에서 사용하는 기본 함수 호출 규약을 쓰세요.


Q )

__cdecl




2)  원형이 char* __stdcall TestFunc(int, double);인 함수에 대한 포인터 변수를 선언하려 합니다. 적절한 자료형식을 

기술하세요.


Q )

char* (__stdcall *pfTestFunc) (int, double)



3)  특정 함수를 호출할 때 함수의 주소를 매개변수로 전달한 후, 주소가 전달된 함수가 특정 함수로부터 호출되는

구조는 무엇인지 쓰세요.


Q )

Call back



4) 정적 라이브러리 파일의 확장명은 무엇인지 쓰세요.


Q )

~.lib



5)  헤더파일이 여러 번 중복해서 포함되는 것을 막기 위한 전처리기 코드는 무엇이고, 이 코드를 기술하는 위치는 

헤더파일 내부 중 어디인지 쓰세요.


Q )

#pragma once 

헤더파일의 가장 위에 쓴다. 





- 출처 : 독하게 시작하는 C 프로그래밍 (최호성, 루비 페이퍼)