作者zzss2003 (brotherD)
看板C_and_CPP
標題[問題] C的strict aliasing rule
時間Wed Jan 23 13:37:04 2019
嗨,大家今天過的好嗎?
網址:
https://reurl.cc/nZnAe
裡面的一小段程式碼:
float funky_float_abs (float a)
{
unsigned int temp = *(unsigned int *)&a;
temp &= 0x7fffffff;
return *(float *)&temp;
}
取浮點數的絕對值
網址裡面說這樣寫會出問題,因為用char*與void*以外的型別(以這例子: unsigned int)
拿位址(&a)會讓pointer指到別的address上。
但我用TDM-GCC 4.9.2與ideone(gcc6.3)編譯並沒有出現問題
結果:
https://ideone.com/HJ6qX0
因為stackoverflow的這篇文章是10年前,我在想這部分是不是後來在C standard有被修正
過,但是網路上找找不到相關資訊,故上來請教一下板友~
感恩感恩
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.216.18
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1548221834.A.B4B.html
1F:→ samuelcdf: #1CUzwZv7 請看本板討論串, 以前我被電過 +_+ 01/23 14:48
2F:→ samuelcdf: 我找了一下午, 也沒有找到什麼資訊, 不過我想這只是因 01/23 17:30
3F:→ samuelcdf: 為undefined behavior出來結果剛好跟我們想的一樣而已 01/23 17:31
4F:推 lovejomi: 我比較想知道 乍看想法我都不會覺得有問題,該怎麼知道 01/23 19:05
5F:→ lovejomi: 這寫法是很可能undefined behavior呢? 01/23 19:05
7F:→ lovejomi: 假設是在little endian的機器上 我查了一下 轉成uchar* 01/23 23:13
8F:→ lovejomi: 沒有違反 strict alias, 那這樣可以嗎?還是一樣有問題 01/23 23:13
9F:→ samuelcdf: 用union, char*, unsigned char*都可以 01/24 09:37
10F:→ descent: 可能你的 int, float 大小一樣 01/24 16:21
12F:推 LPH66: strict aliasing rule 不是表示它真的指到別處了 01/26 14:31
13F:→ LPH66: 而是編譯器會假設不同型態指標指的一定是不同物件 01/26 14:32
14F:→ LPH66: 利用這個假設來進行許多的最佳化 01/26 14:32
15F:→ LPH66: 這個是 C 語言標準給的自由空間 01/26 14:34
16F:→ LPH66: 那編譯器在不同的最佳化層級下會不會用這條規則進行最佳化 01/26 14:35
17F:→ LPH66: 就要看各自編譯器的設計了 01/26 14:35
18F:推 IhateOGC: 這讓我想到C++當C寫的天兵 01/31 11:24