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時のみです。
--------------------------------------------------------------