-
뇌를 자극하는 C++ STL 2,3장) 함수 포인터와 함수 객체PROGRAMMING/STL 2024. 1. 17. 08:16
정진! 앞으로 나아가쟈!!😚😚
(혹시 저작권에 문제가 있다면 수정하겠습니다!! 개인적인 공부용으로 정리함을 알려드립니당)
https://m.hanbit.co.kr/store/books/book_view.html?p_code=B5912645820
* 개인적으로 다른 개념과 비교해서 설명해주는 방식을 선호하는데, 이 책은 다른 정의와 비교해줘서 너무 좋다!(대강추!)
- 변수 : 값을 저장하는 메모리 공간의 이름
- 포인터 : 주소를 저장하는 메모리 공간의 이름
- 함수 포인터 : 함수의 시작 주소를 저장하는 포인터
int func(int a, int b); // 함수의 정의 int (*pf)(int int); // 함수 포인터
함수의 종류
1. 정적 함수 : void (*pf)(int)
- 전역 함수
- namespace 내의 함수
- static 멤버 함수
2. 멤버 함수 : void (Point::*pf)(int)
- 객체로 멤버함수 호출 (*연산자 이용, 객체.(*pf)(1))
- 객체의 주소로 멤버 함수 호출 (->*연산자 이용, (주소->*pf)(10))
함수 호출 규약
함수의 호출 규약: 함수 호출 시 전달되는 인자의 순서나 함수가 종료될 때 함수의 스택을 정리하는 시점 등의 약속
(ex) stdcall, cdecl, thiscall, fastcall 등
[C++] 정적함수 : cdecl, 멤버함수 : thiscall
→ 정적 함수 포인터와 멤버 함수 포인터를 각기 다르게 선언
클라이언트 코드와 서버 코드
서버(코드) : 어떤 기능이나 서비스를 제공하는 코드
클라이언트 (코드) : 그 기능을 제공받는 코드 측
클라이언트가 서버를 호출하면 콜(call), 서버가 클라이언트를 호출하면 콜백(callback)
콜백 매커니즘은 STL 뿐 아니라 윈도의 프로시져 등 많은 곳에서 채택한 매커니즘이다. 이를 구현하려면 클라이언트가 서버를 호출할 때 서버에 클라이언트의 정보를 제공해야 한다. 정보 제공을 위해 함수 포인터 매개변수를 이용해 콜백 함수의 주소를 전달하는 방법이 대표적이다.
함수 객체(Functor; Function Object)
함수 객체 : 함수처럼 동작하는 객체 = ()연산자를 오버로딩한 객체 = Functor
장점
1.멤버 변수와 멤버 함수를 가질 수 있고 일반 함수에서 하지 못하는 지원을 받을 수 있다.
2. 함수 객체의 서명이 같더라도 객체 타입이 다르면 서로 전혀 다른 타입으로 인식한다.
2. 속도도 일반 함수보다 함수 객체가 빠르다.
4. 함수의 주소 전달 시 함수 포인터는 인라인될 수 없지만, 함수 객체는 인라인될 수 있고 컴파일러가 쉽게 최적화 가능
(함수 포인터는 함수가 있어야 하므로 인라인 함수의 복사본 함수를 만들어냄)
struct Less{ bool operator()(int a, int b) return a < b; }; int main(){ Less l; cout << l(10, 20) << endl; // l 객체로 암묵적 함수 호출 cout << Less()(10, 20) << endl; // 임시객체로 암묵적 함수 호출 cout << l.operator()(10, 20) << endl; // 명시적 호출 cout << Less().operator()(10, 20) << endl;
* 클래스 내부에 멤버함수를 정의하면 자동으로 inline 함수가 된다.
inline 함수는 컴파일러가 처리하지만, define 함수는 전처리기가 처리한다.
https://m.blog.naver.com/dd1587/221100746557
'PROGRAMMING > STL' 카테고리의 다른 글
뇌를 자극하는 C++ STL 7장) 연관 컨테이너(set, multiset, map, multimap) (0) 2024.02.29 뇌를 자극하는 C++ STL 6장) 시퀀스 컨테이너(vector, deque, list) (2) 2024.02.28 뇌를 자극하는 C++ STL 5장) STL 소개 (2) 2024.01.27 뇌를 자극하는 C++ STL 4장) 템플릿(함수 템플릿, 클래스 템플릿) (0) 2024.01.19 뇌를 자극하는 C++ STL 1장) 연산자 오버로딩 (0) 2024.01.17