gcc -O3,数据指针似乎迷路了

时间:2014-04-30 14:42:43

标签: c gcc optimization

根据优化级别,输出的不同之处如下:

意外输出:

$ gcc -Wall -O3  otest.c -o otest                   
$ otest                                             
*x: 0 
y: 2048.899902 
y: 0.000000 

预期产出:

$ gcc -Wall -O2  otest.c -o otest 
$ otest                           
*x: 45000e66 
y: 0.000000 
y: 2048.899902

源代码:

#include <stdio.h>
int main(void)
{
   float y = 2048.9;
   void *p = &y;
   unsigned int *x = p;
   printf(" *x: %x \n",*x);
   *x = 0; 
   printf(" y: %f \n",y);
   *x = 0x45000e66;
   printf(" y: %f \n",y);  
   return 0;
 }

gcc版本是4.2.1。

我错过了任何重要指令吗?

1 个答案:

答案 0 :(得分:4)

是。您的代码违反了严格别名规则(当您有float但是通过指向unsigned int的指针访问它时,这是一种不兼容的类型),调用未定义的行为,因此允许编译器用你的代码做任何你喜欢的事情,包括完全消除它的一部分。