성능 향상을 위한 이론
함수 호출에는 비용이 필요하다. 따라서 아주 간단한 작업을 함수로 만드는 것은 비효율적이다.
하지만 간단한 작업이 자주 반복되는 경우가 있는데, 이러한 경우 과거 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 |