인라인 함수 강제로 적용 __attribute__((always_inline))
inline 키워드는 GCC에서는 강제가 아니다. 그건 괜찮은데, 최적화 레벨을 높이지 않으면 간단한 메소드도 인라인하지 않는다.
최적화 레벨을 높이는 것이 어렵진 않지만, 흠, 개발 중엔 최적화 플래그를 안 쓰는데 인라인이 안 되다니 찝찝하다.
inline __attribute__((always_inline)) void func(){ printf("always_inline!\n"); }
__attribute__((always_inline)) 이 키워드를 써 줌으로써 최적화 레벨에 상관없이 함수를 인라인한다.
/main.cpp----------------------------------------------------------------------/
#include <cstdlib>
#include <iostream>
using namespace std;
inline __attribute__((always_inline)) void func(){ printf("always_inline!\n"); }
inline void func2(){ printf("inline!\n"); }
void func3(){ printf("normal function!\n"); }
int main(int argc, char *argv[])
{
func();
func2();
func3();
system("PAUSE");
return EXIT_SUCCESS;
}
/---------------------------------------------------------------------------/
위와 같은 코드를 컴파일하면, 아래와 같은 결과가 나온다.
call ___main
movl $LC1, (%esp) //강제 인라인한 메소드, 직접 어셈블리로 번역되었다.
call _printf
call __Z5func2v //일반 인라인인 경우, 번역않고 CALL을 한다.
call __Z5func3v //일반 함수의 경우 당연히 CALL
movl $LC2, (%esp)
call _system
movl $0, %eax
즉, 최적화 플래그 (-Ox )를 쓰지 않고도 인라인 함수 기능을 쓸 수 있다는 것. 명령어가 좀 길지만,
#define macro inline __attribute__((always_inline))
식으로 정의해서 쓰면 괜찮을 듯 하다.
PS.인라인 함수 안에 인라인 함수를 쓰거나 순환 관계가 생기거나 하면 컴파일하다 재난이 발생하는 모양이니
생각보다 복잡한 기능인가 보다.