오늘의 코드카타
N으로 표현
- 사칙연산 + DP
- LV3 - 30% (복습 필요)
-> 문제 풀이
오늘의 공부
오늘의 CS
inline 키워드
- 개념
- 함수 호출이 아니라, 함수 본문을 호출 위치에 직접 삽입하라고 컴파일러에게 요청
- 컴파일러는 반드시 인라인하는 것이 아닌 최적화를 판단해서 할 수도 있고, 안 할 수도 있음
- 사용되는 용도
- 예전 : 짧고 자주 호출되는 함수 (getter, setter 같은 작은 함수) -> 함수 호출 오버헤드 감소
- 최신 : 헤더 파일에 함수 정의를 넣을 때 -> ODR(One Definition Rule) 완화
- 컴파일러 내부 동작 과정
- 파싱 단계
inline 함수 정의를 만나면, "이 함수는 여러 번 정의될 수 있다"라고 기록
- 다른 번역 단위에서 동일한 정의가 나와도 에러 아님
- 컴파일러 최적화 돤계
- 함수 크기, 호출 빈도, 최적화 옵션 등을 고려해서 인라인 여부를 결정
- 링킹 단계
- 동일한
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 키워드를 붙이지 않을 경우 아래와 같은 링크 에러 발생
