카테고리 없음

인라인 함수 강제로 적용 __attribute__((always_inline))

게임이좋다 2011. 5. 6. 22:15

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.인라인 함수 안에 인라인 함수를 쓰거나 순환 관계가 생기거나 하면 컴파일하다 재난이 발생하는 모양이니

생각보다 복잡한 기능인가 보다.