원래 inline 키워드는 해당 라인의 코드를 직접 끼워 넣을때 사용한다고 알고 있습니다.
가령
inline void swap(int& a, int& b) // A
{
int c;
c = a; a = b; b = c;
} // B
를 함수 내에서 호출하면 위 함수가 호출되는 것이 아니라, // A에서 //B까지의 해당 코드가 직접 끼워 들어간다는 것이죠.
swap 인라인 함수를 100군데 쓰면 //A에서 //B까지의 코드가 100번이 반복되어야 하겠죠.
이건 그간 inline 에 대해 알려진 사항이고, 거의 대부분의 플머들이 컴파일러가 이렇게 처리할 것이라고 기대합니다.
정말 그렇게 될까요?
빌더로 수차례 실험해 봤는데 inline을 붙이나 안붙이나 똑 같군요.
해당 코드를 만들고 어셈블리 코드를 비교해보면 inline 키워드가 있으나 없으나 같은 코드를 하고 있습니다.
최적화 옵션을 써도 인라인 함수를 call하는 형태에는 변함이 없습니다.
이건 컴파일러가 컴파일이 불필요하다고 여기고 있는 것이 아닐까 하는 생각이 드는군요.
inline 은 클래스에서 많이 사용하니 클래스내에서 사용하면 달라질까요?
이것도 실험해보면 역시 똑 같습니다.
이렇게 되면 inline 은 불필요한 키워드인 셈이 되죠.
하지만 inline 에 대해 이렇게 이야기 하는 사람은 아무도 없습니다.
그건 뭔가 잘못 알았다는 것이죠.
프로젝트 옵션의 컴파일러 탭에는
[ ] Disable inline expansions
는 옵션이 있습니다.
보통 여기에 체크가 되어 있어서 inline 키워드가 동작하지 않았던 것입니다.
인라인 확장을 안하겠다는데 디폴트로 체크되어 있는 것은 inline 확장이 사실 그다지
잇점이 적기 때문일 것입니다.
이 곳의 체크를 빼고 컴파일하여 어셈블리 코드를 확인하면 인라인 함수가 함수 형태가 아닌
연속되는 코드 형태로 제대로 삽입되어 있는 것을 볼 수 있습니다.
하지만 주의할 것은 옵션에 지정해주어도 inline 함수가 반드시 해당 위치에 코드로
삽입되어 들어간다는 것은 아니라는 것입니다.
컴파일러가 판단해서 삽입할지 그냥 함수호출로 처리할지 결정합니다.
VC++의 경우도 마찬가지 현상을 보입니다.
VC++은 옵션의 C++/최적화 부분에서 조정하면 됩니다.
inline 열심히 써 놓고는 옵션 조정을 안해 전혀 무용지물로 만드는 실수를 하는 경우를 방지하기 위해...
이상, 알아도 몰라도 상관없는 허접 팁이었습니다.
|
{
///
}
이런 형태의 가변인자 함수는 절대로 코드가 인라인 되지 않습니다.
가끔 유명 프로그램 소스를 보면 TRACE 코드를 완전히 없애버리기 위해
트릭으로 위와 같은 가변인자형 인라인 함수를 릴리즈모드에서 적용되게 했지만
어셈블리 코드로 확인한 결과 실제로는 전혀 효과가 없습니다.
가변인자 함수를 완전히 바이너리에서 빼내는 방법은
함수 인자에 따라 달리 처리하게 오버로딩 함수를 많이 만드는 방법과,
(이 경우 각 함수의 구현 내용은 모두 텅텅 비어야 겠죠)
함수 인자수에 따른 복잡한 매크로 선언으로 해결하는 수 밖에 없습니다.