인라인 함수 (Inline)
카테고리: Cpp
🤯 언리얼을 하기 위해 C++ 기억 되살리기 프로젝트
인라인 함수 (Inline)
코드의 가독성과 성능을 둘 다 잡은 것.
- 함수는 메모리 안에 ‘할당’되어 있음
- 함수를 호출하기 위해 필요한 단계들
- 변수들을 스택에 push
- 함수 주소로 점프
- 함수 실행
- 호출자 함수로 다시 점프
- 1번에서 넣어줬던 변수들을 pop
- 그래서 좀 더 느리다!
- 가독성을 위해 함수를 쓰면 좋은 경우가 있긴 함. 함수 호출에 필요한 오버헤드를 해결할 방법.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 인라인 멤버함수
// Animal.h
class Animal
{
public:
Animal(int age);
inline int GetAge() const;
private:
int mAge;
};
int Animal::GetAge() const
{
return mAge;
}
// main.cpp
Cat* myCat = new Cat(2, "Coco");
int age = myCat->GetAge(); // <- 위에서 inline으로 선언해준 함수
// 컴파일 하면 myCat.mAge; 로 바꿔 읽어서 대입해준다.
// 단 액세스 권한이 있는지 체크는 함 (public 이라던가)
// 멤버 아닌 인라인 함수
// Math.h
inline int Square(int number)
{
return number * number;
}
💡 매크로(MACRO)와 매우 비슷한 개념
- 매크로는 디버깅 하기가 힘듦
- 콜스택에 함수 이름이 안보임
- 중단점도 설정 불가능
- 매크로는 범위가 없음. global. 매크로를 쓸 이유가 있지 않는 한 인라인 함수를 쓰자
1
2
3
4
5
6
7
8
// 매크로 예시
#define SQUARE(x) (x)*(x)
// define은 컴파일 하기 전에 전처리기(preprocessor)에서 처리해줬었음
int main()
{
int result = SQUARE(3); => (3)*(3);
}
1. 동작 원리
1
2
3
4
5
6
7
8
9
10
11
12
13
inline int Square(int number)
{
return number * number;
}
int main()
{
int number = 2;
int result = Square(number);
// 위 코드를 컴파일러가 밑 코드로 바꿈
int result = number * number;
return 0;
}
2. 사용시 주의점
- inline 키워드는 힌트일 뿐
- 실제로는 inline 안될 수도 있음
- 컴파일러가 자기 맘대로 아무 함수나 inline 할 수도 있음;;
- 그래서 어떤 컴파일러에선 __forceinline 을 붙여서 inline 을 강요할 순 있는데, 안될 수도 있음;;
- 인라인 함수 구현이 헤더 파일에 위치해야 함
- 복붙을 하려면 컴파일러가 그 구현체를 볼 수 있어야 해서
- 각 cpp 파일은 따로 컴파일 됨.
- 따라서 b.h를 인클루드 하는 a.cpp 파일을 컴파일 할 때, 컴파일러는 b.cpp에 뭐가 들어있는지 모름!
- 간단한 함수에 적합
- getter, setter
inline int GetX() const;
inline void SetX(int x);
- getter, setter
- 실행파일의 크기가 증가하기 쉬움
- 동일한 코드를 여러 번 복붙하게 되는거니까
- 남용하지 말 것
- 실행파일이 작을 수록 CPU 캐시하고 잘 작동 -> 속도가 빨라지는 이유
3. 사용법
- 멤버 아닌 인라인 함수
1 2 3 4
inline <return-type> <function-name> (<argument-list>) { // ... };
- 인라인 멤버 함수
1 2 3 4 5 6
// 헤더 선언부에 이미 inline 써놨고 헤더에 구현하므로 굳이 inline 안붙여도 된다 // 그치만 가독성을 위해... inline <return-type> <class-name>::<function-name> (<argument-list>) { // ... }
댓글남기기