09.05 - TIL

김혁·2025년 9월 6일

TIL

목록 보기
12/84

오늘의 코드카타

N으로 표현

오늘의 공부

  • 팀프로젝트 회의

오늘의 CS

inline 키워드

  • 개념
    • 함수 호출이 아니라, 함수 본문을 호출 위치에 직접 삽입하라고 컴파일러에게 요청
    • 컴파일러는 반드시 인라인하는 것이 아닌 최적화를 판단해서 할 수도 있고, 안 할 수도 있음
  • 사용되는 용도
    1. 예전 : 짧고 자주 호출되는 함수 (getter, setter 같은 작은 함수) -> 함수 호출 오버헤드 감소
    2. 최신 : 헤더 파일에 함수 정의를 넣을 때 -> ODR(One Definition Rule) 완화
  • 컴파일러 내부 동작 과정
    1. 파싱 단계
      • inline 함수 정의를 만나면, "이 함수는 여러 번 정의될 수 있다"라고 기록
      • 다른 번역 단위에서 동일한 정의가 나와도 에러 아님
    2. 컴파일러 최적화 돤계
      • 함수 크기, 호출 빈도, 최적화 옵션 등을 고려해서 인라인 여부를 결정
    3. 링킹 단계
      • 동일한 inline 함수 정의가 여러 개 발견되면, 컴파일러가 하나로 통합
  • 주의할 점
    • 남발하면 코드 크기 증가 -> 오히려 성능 저하
    • 가상 함수는 일반적으로 인라인 불가
    • 최적화 수준이 높으면, inline을 붙이지 않아도 컴파일러가 자동으로 인라인할 수 있음

ODR

  • 개념
    • 프로그램 전체에서 특정 엔티티(함수, 변수, 클래스 등)는 정확히 하나의 정의만 가져야 한다는 규칙
    • 여러 번 선언은 허용되나, 정의는 하나여야만 한다.
  • inline
    • 보통 함수 정의가 여러 번 있으면 ODR 위반으로 링크 에러가 발생
    • C++ 표준으로 inline 함수의 정의는 여러 번 나와도 된다고 허용
    • 링커가 같은 함수로 인식하고, 중복 정의를 하나로 합쳐줌
  • 예시
// util.h
inline int add(int a, int b) {
    return a + b;
}

// a.cpp
#include "util.h"

// b.cpp
#include "util.h"

-> inline 키워드를 붙이지 않을 경우 아래와 같은 링크 에러 발생

profile
게임 개발자를 향해..

0개의 댓글