[VC] #pragma

VC++에서 #pragma 사용법 설명..

MSDN에 최적화 관련 #pragma 용법은 아래와 같다.

http://msdn.microsoft.com/ko-kr/library/h7k3a0bw.aspx

 

#pragma auto_inline

#pragma check_stack

#pragma function

#pragma inline_depth

#pragma inline_recursion

#pragma intrinsic

#pragma optimize

 

이중에서 일단,

#pragma function

#pragma intrinsic

#pragma optimize

에 대해서 정리하고 다음것은 나중에 정리하자.

 

1. #pragma function

<사용법>
#pragma function( function1 [, function2, ...] )

intrinsic pragma는 컴파일러에 intrinsic function(function call이 아니라, inline code처럼 code자체를 함수 사용하는 장소에 삽입)을 생성하도록 지시한다.

function pragma는 컴파일러에게 강제적으로 function call형태로 구현되도록 지시한다.

function pragma 선언후 intrinsic function으로 기술된  첫 함수부터 영향을 미쳐, 소스코드의 마지막라인까지 영향을 미치거나, 동일한 함수명을 intrinsic pragma로 지시한 라인을 만날때 까지 영향을 미친다.

 

<사용예시>

#include <string.h>

// use intrinsic forms of memset and strlen
#pragma intrinsic(memset, strlen)


// Find first word break in string, and set remaining
// chars in string to specified char value.
char *set_str_after_word(char *string, char ch) {
   int i;
   int len = strlen(string);  /* NOTE: uses intrinsic for strlen */

   for(i = 0; i < len; i++) {
      if (isspace(*(string + i)))
         break;
   }

   for(; i < len; i++)
      *(string + i) = ch;
  
   return string;
}

// do not use strlen intrinsic
#pragma function(strlen)


// Set all chars in string to specified char value.
char *set_str(char *string, char ch) {
   // Uses intrinsic for memset, but calls strlen library function
   return (char *) memset(string, ch, strlen(string));
}

int main() {
   char *str = (char *) malloc(20 * sizeof(char));

   strcpy_s(str, sizeof("Now is the time"), "Now is the time");
   printf("str is '%s'\n", set_str_after_word(str, '*'));
   printf("str is '%s'\n", set_str(str, '!'));
}

 

2. #pragma intrinsic

<사용법>

#pragma intrinsic( function1 [, function2, ...] )

 

intrinsic pragma를 사용하면, 컴파일러가 판단하기에 inline code로 처리하는 것이 좋은면 inline화 시키고 그렇치 않으면 function call 형태를 취하도록 한다.

intrinsic pragma는 function pragma와 페어로 사용될 수 있으며, intrinsic pragma로 지시된 함수는 그다음라인부터 영향을 받아서 function pragma로 재 지정되기 전에는 소스파일전체에 영향을 미친다.

 

<사용예시>

// pragma_directive_intrinsic.cpp
// processor: x86
#include <dos.h> // definitions for _disable, _enable
#pragma intrinsic(_disable)
#pragma intrinsic(_enable)
void f1(void) {
_disable();
// do some work here that should not be interrupted
_enable();
}
int main() {
}

3. #pragma optimize

<사용법>
#pragma optimize( "[optimization-list]", {on | off} )
 
optimize pragma는 함수 밖에 선언이 되며 pragma가 선언된 후 정의된 첫번째 함수에 영햐응ㄹ 미친다.
on/off 파라미터로 optimization-list에 정의된 옵션들을 설정/미설정할수 있다.
[[optimization-list]]
g      : Enable global optimizations.
p      : Improve floating-point consistency.
s or t : Specify short or fast sequences of machine code.
y      : Generate frame pointers on the program stack.

optimize pragma에서 empty string("")는 특별한 기능을 담고 있다.
-.off 파라미터 사용시, optimization-list의 모든 옵션을 off시킴
-.on 파라미터 사용시, '/O' compiler option으로 설정된 옵션을 재설정시킴
 
<사용예시>
#pragma optimize( "tp", on )
 
#pragma optimize( "", off )
.
.
.
#pragma optimize( "", on )

출처 : http://blog.naver.com/kri7001/30037616891
위로 스크롤