[英]gcc -O3 , data pointer seems to get lost
根據優化級別,輸出結果如下:
輸出意外:
$ 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。
我錯過任何重要的指示嗎?
是。 您的代碼違反了嚴格的別名規則(當您有float
,但是通過指向unsigned int
的指針訪問它,這是一個不兼容的類型),調用了未定義的行為,因此允許編譯器對您的代碼執行任何其喜歡的操作,包括完全消除其中的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.