본문 바로가기

Programming/C language

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

성능 향상을 위한 이론 


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


하지만 간단한 작업이 자주 반복되는 경우가 있는데, 이러한 경우 과거 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 프로그래밍 (최호성, 루비 페이퍼) 



'Programming > C language' 카테고리의 다른 글

Chapter 16. 전처리기  (0) 2017.07.04
Chapter 15. 변수와 상수 고급 이론  (0) 2017.07.04
Chapter 14. 파일 입출력  (0) 2017.07.03
Chapter 13. 구조체와 공용체  (0) 2017.07.02
Chapter 12. 함수 응용 (문제풀이)  (0) 2017.06.30