e204.c

最適化時、変数異常


/********************************/ /* volatileの用例 */ /********************************/ #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <setjmp.h> static void e204(){ e204();} jmp_buf env; void setflag(void) { (void)signal(SIGINT,(void (*)())setflag) ; longjmp(env, 1); } int main() #if V volatile int i = 0 ; char *volatile p = "前" ; #else int i = 0 ; char * p = "前" ; #endif int lookme1 ; int lookme2 = 0 ; (void)signal(SIGINT,(void (*)())setflag) ; if (setjmp(env) == 1) { printf("%d¥n",lookme1) ; printf("%d¥n",lookme2) ; printf("¥n") ; printf("i = %d¥n",i) ; printf("p = %s¥n",p) ; exit(0) ; return(0) ; } for(;;) { p = "後" ; i = 100 ; } /*NOTREACHED*/
対象者: 本文は、UNIX上で走行するアプリケーション開発者で 『最適化』 『longjmp』 を使用されている方を対象として説明します。
解説: volatile指定有り/無しと 最適化有り/無しで走行結果が異なります。 以下の表を参考にして下さい。
  K&R-C ANSI-C
  Kopt=0 Kopt=2 Kopt=0 Kopt=2
volatile無し 100
0
100
0
volatile有り 100
100
上記の様に、非最適化時と 最適化時で走行結果に差分が無いのは volatile有りのANSI-C時のみです。 --------------------------------------------------------------