Publish:

태그: , ,

카테고리:


🤯 언리얼을 하기 위해 C++ 기억 되살리기 프로젝트

인라인 함수 (Inline)

코드의 가독성과 성능을 둘 다 잡은 것.

  • 함수는 메모리 안에 ‘할당’되어 있음
  • 함수를 호출하기 위해 필요한 단계들
    1. 변수들을 스택에 push
    2. 함수 주소로 점프
    3. 함수 실행
    4. 호출자 함수로 다시 점프
    5. 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);
  • 실행파일의 크기가 증가하기 쉬움
    • 동일한 코드를 여러 번 복붙하게 되는거니까
    • 남용하지 말 것
    • 실행파일이 작을 수록 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>)
    {
      // ...
    }
    

이슈 및 공부한 것을 기록해두는 개인 블로그 입니다. 댓글, 피드백 환영합니다 🙂

Update:

댓글남기기