프로그래밍 언어/C & C++ 정리

인라인 함수

뽀또치즈맛 2024. 11. 25. 10:34

 

함수를 호출할 때 필요 조건

  • 함수는 메모리 안에 "할당"되어 있다.
  • 함수를 호출하기 위해 필요한 단계들
    1. 변수들을 스택에 push
    2. 함수 주소로 점프
    3. 함수를 실행
    4. 호출자 함수로 다시 점프
    5. 1번 단계에서 넣어뒀던 변수들을 "pop"

함수 주소로 이동되서 써야하니까 변수를 스택에 넣어두고
스택에서 가리키는 포인터를 확 뒤돌리는 것 만으로도
충분히 그 값을 쓸 수 있다.
하나하나 빼서 쓰지는 않다.
 
여기서 실제 컴퓨터 아키텍처에 따라
4,5번은 순서가 뒤바뀔 수 있다.
 

함수의 단점

뭔가 여러 단계를 거치므로 생기는 단점이 있을 것 같지 않은가?
 

  • 여러 단계를 거치다보니 좀 더 느리다는 단점있다.
  • CPU 캐시에 최적이 아닐 수도 있으면 더 느리다.
  • 모던 cpu 아키텍처에서는 더 느리다.

 
특히나 캐시 최적화나 이런 점 때문에 
느린 속도를 가진다.
 
모든 걸 함수로 만들면 어떻게 될까?
좀 느려진다.
 
간단한 거 하나에도 함수를 쓰면서,
모든 동작을 함수로 되는게 좋다,
가독성이 좋다.
유지 보수성이 좋다.
이런 착각을 하지말자.
 
모든 걸 함수로 만드는 것 올바르지 않다.
 

함수의 장점

그럼 언제 함수로 만드는 것이 좋을까?
재활용성이 있을 때,
 
아니면 정말 코드가 길어지는 경우 가독성을 높일 때이다.
함수 위에 프로토 타입만 보고 알 수 있도록 하는 경우이다.
 

  • 가독성을 위해 함수를 쓰면 좋은 경우들에 사용
  • 재활용성이 있을 때

 

그럼 인라인 함수는 언제 쓰나요?

 
함수호출에 필요한 오버헤드를 떠맡기에는 부담이 되고
연산 그 자체는 매우 단순할 때 쓰기 좋은 코드일 때 씁니다.
 

인라인 함수의 동작원리

 
사실상 코드 복사 붙여넣기 한 것과 비슷하다.
함수호출 대신에 해당 자리에 인라인 함수의 내용이 들어가게 된다.
 
컴파일하면 컴파일된 코드에서는 함수 호출을 다 빼놓고,
그냥 읽어서 대입해준다.
 
함수단에서 public인지 private인지는 체크는 해준다.
 

인라인과 매크로

인라인은 매크로와 매우 비슷한 개념이다.
매크로는 순수하게 텍스트 복사이다.
단, 매크로는 컴파일러가 아니라 preprocessor(사전 처리기)라는 애가 처리한다.
 
동작 원리는 인라인과 매크로랑 똑같이 복붙이라는 개념은 똑같지만,
누가 담당하느냐가 좀 다르다.
 
약간 단계가 다르고
그 단계에 따라 바뀌는 것이 있다.
 

매크로의 단점

정말 매크로를 쓸 이유가 있지 않는한 인라인 함수를 쓰자.
이유는 다음과 같다.

  • 매크로는 인라인에 비해서 디버깅하기 힘들다.
    • 콜스택에 함수이름이 안보인다.
    • 중단점 설정도 불가능하다.
  • 매크로는 범위를 준수하지 않는다.
    • 매크로는 그냥 글로벌이다.
    • 예쁘게 그룹짓기 어렵고 이름 충돌이 난다.

 
특별한 이유가 없는한 인라인 함수를 쓰는 게 옳은 선택이다.
 

인라인 함수의 동작원리

 

 
 
이런 인라인 함수를 쓸 때는 다음과 같은 경우을 주의하자.
 
inline는 키워드일 뿐 컴파일러가 알아서 결정한다.
붙여도 안붙여도 컴파일러가 인라인 함수로 만들 수도 안만들 수도 있다.
 
forceinline 붙여도 컴파일러가 알아서 한다.
대신 되도록 인라인으로 써주세요 하고 컴파일러에게 부탁하는 것이다.
그나마 좀 더 해줘 라는 뜻이지, 컴파일러가 알아서 결정한다.
 
그래서 실제로 인라인이 안될 수도 있다.
또한 인라인 함수 구현이 헤더 파일에 위치해야 한다.
복붙을 하려면 컴파일러가 그 구현체를 볼 수 있어야 하기 때문이다.
각 cpp 파일은 따로 컴파일 된다.
따라서 b.h를 인클루드 하는 a.cpp 파일을 컴파일 하 ㄹ때,
컴파일러는 b.cpp에 뭐가 들어있는지 모른다.
 

인라인 함수를 쓸 때 유의할 점

 
간단한 함수에 적합하다 특히 getter, setter를 구현할 때 말이다.
 
실행 파일의 크기가 증가하기 쉽다.
동일한 코드를 여러번 복붙하니까 함수 호출의 과부하는 없어지지만,
실행 파일의 용량 자체는 늘어나게 된다.
남용하지 말자.
최신의 아키텍처에서는
실행 파일이 작아질 수록 성능이 빨라지는 행태를 보일 때도 있다.