On this page
article
C++ Inline
inline function
인라인 치환
일반 함수는 함수 인자를 레지스터에 넣고 호출
인라인의 경우 함수 호출 코드를 함수의 기계어 코드로 치환
compiler explorer에서 어셈블리 확인가능
- gl은 최적화 옵션(-O2)을 적용했을 때 전부 최적화해서 확인하기 어려우니 cl에서 -Ob1 적용
add1(int a, int b) { return a + b; } int ret1 = add1(1,2); mov edx,2 mov ecx,1 call int add1(int, int)
inline int add2(int a, int b) { return a + b; } // add2자체의 어셈블리 생성되지않을 수 있음. 주소같은 걸 구하는 코드가 있을 때 생성됨 int ret1 = add2(1,2); mov eax,1 add eax,2 // 바로 덧셈
장점
- 빠르다
단점
- obj파일이 커져서 메모리 사용량 증가 가능
유의
- 실제로 치환될지 안될지는 컴파일러 종류와 옵션에 따라 다르고 인라인이 아닌 함수도 치환될 수 있음
inline function2
- multiple definition 허용
- 상황1
- 다른 파일에 있는 inline 함수를 사용할 때 inline 함수는 기계어 코드로 치환되어야하므로 구현 자체를 헤더에 넣어야함
- 상황2
- 일반 함수의 구현을 헤더파일에 작성하게되면 그 헤더파일을 여러 소스에서 인클루드할 경우 링킹 시 에러, 동일한 시그니처 함수 구현이 여러 개라서. ODR(One Definition rule)
- 이 때 inline사용하면 괜찮다. 혹은 각 소스파일에서 다 똑같은 inline을 정의해도 됨. → 최종적 실행파일에서 호출하는 함수의 주소가 다 똑같음
inline variable
- 상황
- int x = 0;이라는 전역변수가 들어있는 헤더를 여러 소스에서 include해서 사용
- 해결
- extern int x로 선언
- C++ 17의 inline variable 사용
- 해결
- int x = 0;이라는 전역변수가 들어있는 헤더를 여러 소스에서 include해서 사용
- 장점
- head-only 라이브러리를 만들기 쉬워진다. → 추후 inline static member data 내용에서 설명