C++ - inline

mohadang·2022년 9월 24일
0

C++

목록 보기
11/48
post-thumbnail

함수 호출할 때 일어나는 일

  • 스택 프레임이 생성되고 해제되는 과정이 진행
  • 함수 코드로 점프, 함수 코드에서 부터 리턴 되는 과정
  • 그래서 좀더 느림
  • CPU 캐시에 최적이 아닐 수 도 있음
    "- 최근에 사용한 메모리는 캐시에 있는데, 멀리 있는 코드일 수 록 캐시에 없는 경우가 있을 수 있다."
  • 모던 CPU 아키텍처에서는 좀더 느림
  • 잘못된 조언
    • 모든건 함수로 만들어라...
  • "정말 함수를 만들어야 할 때는 재활용성 코드가 길어서 가독성에 지장이 있을 때"
  • 함수 호출로 인해 가독성은 좋아지는데 이로 인해 오버헤드를 없앨 수 있는 방법은 없을까??
Vector vec1;
vec1.Add(vec2);

// 사실은 이렇게 더하는 것 뿐인데... 함수 호출 오버헤드를 감당하자니 뭔가 찜찜하다.
vec1.mX += vec2.mX;
vec1.mY += vec2.mY;
  • 해법은 "인라인 함수".

인라인 함수

//[member]
class Animal
{
pulbic:
  Animal();
  inline int GetAge();
};

int Animal::GetAge()
{
  return mAge;
}

//[not member]
inline int Square(int number)
{
  return number * number;
}
  • 인라인 함수 동작 원리는 코드의 복붙과 거의 같다.
Cat* cat = new Cat();
cout << cat->GetAge() << endl;

컴파일러는 위 코드를 다음과 같이 바꿔준다.
cout << cat.mAge << endl;
int data = Square(num);

컴파일러이 의해서 다음과 같이 변경
int data = num * num;
  • C의 매크로 개념과 비슷, C의 매크로는 순수하게 TEXT 복사이다(컴파일러가 아닌 preprocessor가 처리)

  • 그럼 매크로를 사용해도 되나??? NO...

  • 매크로는 디버깅이 어려움, 브레이크 포인트 못 건다, 콜스택에 나오지도 않는다.

  • 매크로는 범위를 준수하지 않는다.
    무조건 전역

  • 정말로 매크롤를 쓸 이유가 있지 않는한 인라인을 사용.

  • 매크롤 사용하는 경우는 #ifdefine 같이 헤더파일 중첩 방지라 던가 어떤 코드를 컴파일 할지 안할지 결정할 때

  • inline 키워드를 사용할 때 주의할 점

    • inline은 힌트일 뿐 반드시 되리라는 보장이 없다.

      • 실제로는 인라인이 안 될수도 있음.
      • 컴파일러가 자기 마음대로 아무 함수나 인라인으로 바꿀 수 있음.
      • 반대로 inline 키워드를 안 쓰더라도 컴파일러가 inline 함수로 만 들 수도 있다.
    • inline 함수 구현이 헤더 파일에 위치 해야 한다.

      • 복붙을 하려면 컴파일러가 그 구현체를 볼 수 있어야 하기에
      • 각 cpp 파일은 따로 컴파일 됨.
      • 따라서 b.h 를 인크루드 하는 a.cpp파일을 컴파일 할 때, 컴파이러는 b.cpp에 뭐가 들어 있는지 모른다.
      // [B.h]
      class B
      {
      public:
        inline void MyInlineFunction();
      }
      void B::MyInlineFunction()
      {
        cout << "Inline" << endl;
      }
      
      // [a.cpp]
      #include "B.h"
      void Test()
      {
        // B.h에 인라인 구현체가 있어야 코드를 복사 할 수 있다. 없으면 어디서 찾으라고...
      }
  • inline 함수는 간단한 함수에 적합하다.

    • getter, setter, 간단한 수학적인 계산 함수
  • 실행 파일의 크기가 증가 할 수 있다.

    • 동일한 코드를 여러번 복붙 하니까
    • 남용하지 말것
    • 실행파일이 적을 수 록 cpu 캐시가 잘 작동
profile
mohadang

0개의 댓글