인라인을 완전 파해치는 항목이다.
1 ) 인라인화란 무엇인가?
함수를 코드로 직접 대체하는 행위, 라고 정리해도 될 듯 싶다. 이런 행위 때문에, 함수 호출 비용이 없어 진다.
참조 : http://ikpil.com/762
2 ) 인라인화는 언제 수행되는가?
a. 코딩 시점에서?
코딩 시점에서, 프로그래머가 inline 을 지정해 주면서 수행 된다. 코딩 시점에서 inline 키워드를 집어 넣으려면, 세 가지 염두해야할 것이 있다.
첫째, .. 우선 하지 말아야 한다.
둘째, inline 키워드는 컴파일러의 허락을 받아야 한다.
셋째, 인라인화 발생지점을 예측하지 말아야 한다.
셋째 부연 설명 : 인라인화 자체는 함수가 아닌 함수 호출에 대해서 일어난다. 그래서 어떤 지점에서 인라인화 되고, 어떤 지점에서 인라인화가 될 수 있다. 결국 예측은 힘들고, 예측된 것으로 코딩하는 것은 무리가 있다.
즉,코딩 시점에서 인라인화를 수행한다고 본다.
b. 컴파일 시점에서?
컴파일 시점에서, 컴파일러는 소스코드를 기계어로 번역을 한다. 이 때 일반적으로 인라인화가 일어 난다. 하지만 이 "인라인화"의 결정권은 전적으로 컴파일러에게 있다. 그래서 컴파일러가 "인라인화"를 거부 할 수 있는데, 거부는 다음과 같다.
- inline 선언이 된 함수를 인라인화 하지 않음
- inline 선언하지 않은 함수를 인라인화 함
- 동일한 inline 함수를 어디에선 inline 하고, 어디에선 inline 안함
왜 컴파일러에게 이런 권한이 있을까?
컴파일러보다 더 소스코드의 최적화를 정확히 아는 것은 매우 힘들다. 그러므로 이 결정권을 컴파일러에게 줌으로써 최적화를 알아서 시키는 것이다.(소스 코드에 대해서만, 설마 컴파일러가 알고리즘을 짜주겠는가?)
즉, 컴파일 시점에 인라인화가 수행 된다.
c. 링크 시점에서?
소스코드가 h, cpp 파일로 나뉘고, cpp가 기계어로 변환 된 후에, 이런 것들을 링크 시점에서, 컴파일러가 파악하여, 인라인화 할 수 있을 까?
... 컴파일러는 이를 못한다. 번역 단위가 다르기 때문이다. 그런데, 링커라면 어떨까? 매우 진화된 링커는 이런 것도 인라인화 할 수 있다고 책에 적혀있다! 이럴 수가! MSVC 7.0 이상에선 /LTCG 명령을 통하여, 지원한다고 나와있다!
한가지 더 놀랄 만한 사실은, 굳이 정의 부분을 C++ 로 하지 않아도 된다는 것이다. 링커는 그냥 매개변수 전달 규칙데로, 인자를 스택에 넣거나 뽑으며, 프로그램 점프 명령을 적절히 제거 할 수 있다.
즉, 링크 시점에서 인라인화가 수행 된다.
d. 응용 프로그램 설치 시점에서?
설마 .. 되겠어? 라고 생각했다. 하지만 아니다! 1990년대 중반부터, JVM(자바 가상 기계), CLR(공용 언어 런타임)같은 실행시점에 소스코드를 관리하는 환경이 점점 많아지고 있다. 이런것들을 사용하여, 응용 프로그램 설치 프로그램을 만들었다면, .. 설치 시점에, 인라인화가 이루어 질 수 있다.
원리는
1. C++ 코드가 위의 환경에 의하여 inline 코드가 우선 "바이트코드 스트림(가상 기계의 명령:instruction language, IL)"으로 변환 되고, 사람들에게 배포된다.
이 바이트코드 스트림은 위에서 설명한 실행시점 환경에 의하여 옵코드(opcode)로 작성된 프로그램이다.
2. 프로그램 설치를 하려 할 때, 사용자의 컴퓨터에 맞는 기계어 코드로 변환 되는데, 이 때 사용자에게 맞게 더 좋은 최적화를 거치게 된다. 이 때 인라인화가 일어날 수 있다.
- 이건 좀 더 조사해 봐야겠다. -
즉, 응용 프로그램 설치 시점에서 인라인화가 수행 된다.
e. 실행 시점에서?
.. 이것 마저 되겠어? .. 된다! 위에서 설치 시점에서 되듯이, 같은 개념으로 실행시점에 기계어로 변경하는 과정이 있다면 가능하다. 대표적인 예로 JIT 컴파일 방식(JIT : Just-in-time : 실행시점 컴파일 방식), RVM 컴파일러(RVM : Jikes Reserach Virtual Machine : 동적 최적화 컴파일러) 방식들이 있다.
즉, 가능하다!
f. 그 외
.. 또는 더 진화된 환경에서 가능할 것이다.
즉, 가능할 것이다.
총평
인라인 하나가 미치는 영향을 어디까지 생각해야 될까? .. 코드 하나 하나가 어디까지 영향을 미칠까? 이런 질문들은 C++ 을 벗어난다. ... 교양 항목으로 읽어도 될 듯 싶다. 일반적으로 컴파일 시점 까지만 이해해도 틀린것은 아닐 것이다.
'책 정리 > Exceptional C++ Style' 카테고리의 다른 글
항목 30 : double 과 float ( 난이도 : 4 ) (0) | 2009.01.26 |
---|---|
항목 29 : 초기화인가 아닌가? ( 난이도 : 3 ) (0) | 2009.01.25 |
항목 28 : 키워드의 비밀 ( 난이도 : 3 ) (0) | 2009.01.24 |
항목 27 : 자료 포맷과 효율성, 2부 : 비트 다루기 ( 난이도 : 8 ) (0) | 2009.01.24 |
항목 26 : 자료 포맷과 효율성, 1부 : 간결함 ( 난이도 : 4 ) (0) | 2009.01.24 |
항목 24 : const 최적화 ( 난이도 : 3 ) (0) | 2009.01.23 |
항목 23 : new와 예외, 2부 : 메모리 관리의 실질적인 문제들 ( 난이도 : 5 ) (0) | 2009.01.22 |
항목 22 : new와 예외, 1부 : 여러 종류의 new ( 난이도 : 4 ) (0) | 2009.01.22 |
항목 21 : 컨테이너의 메모리 사용, 2부 : 얼마나 큰가? ( 난이도 : 3 ) (0) | 2009.01.22 |
항목 20 : 컨테이너의 메모리 사용, 1부 : 메모리 관리의 여러 수준 ( 난이도 : 3 ) (0) | 2009.01.22 |
최근댓글