인라인 함수(Inline Functions)
코드의 가독성과 성능을 둘 다 잡은 토끼
함수는 메모리 안에 "할당"되어 있음 (코드 섹션)
함수를 호출하기 위해 필요한 단계들
1. 변수들을 스택에 푸쉬(push)
2. 함수 주소로 점프
3. 함수를 실행
4. 호출자 함수로 다시 점프
5. 1번 단계에서 넣어뒀던 변수들을 "팝(pop)"
(하나씩하나씩 팝하는게 아니라 스택 포인터를 되돌리는 것만으로도 충분히 변수들을 읽고 쓴다는 의미)
> 여러 단계가 있어서 좀 더 느림
> CPU 캐시에 최적이 아닐 수도
> 모던 CPU 아키텍처에서는 더 느림
모든 걸 함수로 만들라!! <<<<< 잘못된 조언
재활용성이 있을 때, 정말 코드가 길어졌을 때 가독성을 높이기 위해 함수를 쓰자
가독성을 위해 함수를 쓰면 좋은 경우들이 있음
Vector result = v1.Add(v2);
Vector result;
result.mX = v1.mX + v2.mX;
result.mY = v1.mY + v2.mY;
> 연산 그 자체는 매우 단순하지만, 함수호출에 필요한 오버헤드를 떠맡기에는 좀 부담이;;
>> 인라인 함수 쓰자!
인라인 함수의 동작원리
사실상 복붙과 비슷
> 함수호출 대신에...
> 컴파일 도중에 엑세스 처리 하고(public private 접근권한 있는지 체크해주고) 복붙
매크로(MACRO)와 매우 비슷한 개념
> 매크로는 순수하게 텍스트 복사. 컴파일 단계 이전에 전처리기가 해줌
Q. 그럼 대신 매크로를 써도 되나요?
> A. 아뇨...
>> 매크로는 디버깅 하기 힘듬 (콜스택에 함수이름이 안 보임, 중단점(breakpoint)도 설정 불가능)
>> 매크로는 범위(scope)를 준수하지 않음. 글로벌 변수 쓰는거랑 똑같음.
>> 정말정말 매크로를 쓸 이유가 있지 않는 한 인라인 함수를 쓰자!
인라인 함수를 쓸 때 주의점
inline 키워드는 힌트일 뿐 (inline을 하고 싶다고 컴파일러에게 강력하게 피력하는 것)
> 실제로는 인라인 안 될 수도 있음...
> 컴파일러가 지맘대로 아무 함수나 인라인 할 수도 있음...
인라인 함수 구현이 헤더 파일에 위치해야 함
> 복붙을 하려면 컴파일러가 그 구현체를 볼 수 있어야 하기에...
> 각 cpp 파일은 따로 컴파일 됨
>> 따라서 b.h를 인클루드 하는 a.cpp 파일을 컴파일 할 때, 컴파일러는 b.cpp에 뭐가 들어 있는지 모름
간단한 함수에 적함
> 특히 getter나 setter에...
실행파일의 크기가 증가하기가 쉬움
> 동일한 코드가 여러번 복붙하니까
> 남용하지 말 것
> 실행파일이 작을수록 CPU 캐시하고 잘 작동 -> 속도가 빨라질 수 있음
사용법
// 멤버 아닌 인라인 함수
inline <return-type> <function-name>(<argument-list>)
{
// ..
}
// 인라인 멤버함수
inline <return-type> <class-name>::<function-name>(<argument-list>)
{
// ..
}
함수 선언부에 inline 붙이면 구현부엔 inline 키워드를 안 넣어도 됨
한 줄짜리, 간단한 계산 같은거 써먹기 딱 좋음
연산자 오버로딩도 inline 가능
출처 : 포큐아카데미 C++ 언매니지드 프로그래밍