【问题标题】:gcc -O3 , data pointer seems to get lostgcc -O3 ,数据指针似乎丢失了
【发布时间】:2014-04-30 14:42:42
【问题描述】:

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

意外输出:

$ 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。

我是否遗漏了任何重要的指令?

【问题讨论】:

  • -fno-strict-aliasing
  • @MarcGlisse 甚至不建议这样做。 永远。
  • @MarcGlisse 是的,但您的评论表明这是一个解决方案。不是。
  • @ole 如果不清楚,评论中的随机词不是“解决方案”或“建议”,它是关于在搜索引擎中输入什么以获得更多信息的建议信息并了解您的代码在哪些方面是错误的。
  • 联合在这样的别名情况下更好

标签: c gcc optimization


【解决方案1】:

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

【讨论】:

  • 值得指出的是,如今的编译器确实在尝试做正确的事情——他们会生成代码,假设不存在会导致未定义行为的情况,这可能会打开相当多的优化机会...
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多