[問題] C的strict aliasing rule

看板C_and_CPP作者 (brotherD)時間6年前 (2019/01/23 05:37), 編輯推噓5(5013)
留言18則, 6人參與, 6年前最新討論串1/1
嗨,大家今天過的好嗎? 網址: 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://www.ptt.cc/bbs/C_and_CPP/M.1548221834.A.B4B.html

01/23 14:48, 6年前 , 1F
#1CUzwZv7 請看本板討論串, 以前我被電過 +_+
01/23 14:48, 1F

01/23 17:30, 6年前 , 2F
我找了一下午, 也沒有找到什麼資訊, 不過我想這只是因
01/23 17:30, 2F

01/23 17:31, 6年前 , 3F
為undefined behavior出來結果剛好跟我們想的一樣而已
01/23 17:31, 3F

01/23 19:05, 6年前 , 4F
我比較想知道 乍看想法我都不會覺得有問題,該怎麼知道
01/23 19:05, 4F

01/23 19:05, 6年前 , 5F
這寫法是很可能undefined behavior呢?
01/23 19:05, 5F

01/23 23:12, 6年前 , 6F
https://ideone.com/YKpnuL 請問這寫法會有問題嗎?
01/23 23:12, 6F

01/23 23:13, 6年前 , 7F
假設是在little endian的機器上 我查了一下 轉成uchar*
01/23 23:13, 7F

01/23 23:13, 6年前 , 8F
沒有違反 strict alias, 那這樣可以嗎?還是一樣有問題
01/23 23:13, 8F

01/24 09:37, 6年前 , 9F
用union, char*, unsigned char*都可以
01/24 09:37, 9F

01/24 16:21, 6年前 , 10F
可能你的 int, float 大小一樣
01/24 16:21, 10F

01/25 22:27, 6年前 , 11F
手上有一個相反的例子 https://pastebin.com/Tf8Z4n2p
01/25 22:27, 11F

01/26 14:31, 6年前 , 12F
strict aliasing rule 不是表示它真的指到別處了
01/26 14:31, 12F

01/26 14:32, 6年前 , 13F
而是編譯器會假設不同型態指標指的一定是不同物件
01/26 14:32, 13F

01/26 14:32, 6年前 , 14F
利用這個假設來進行許多的最佳化
01/26 14:32, 14F

01/26 14:34, 6年前 , 15F
這個是 C 語言標準給的自由空間
01/26 14:34, 15F

01/26 14:35, 6年前 , 16F
那編譯器在不同的最佳化層級下會不會用這條規則進行最佳化
01/26 14:35, 16F

01/26 14:35, 6年前 , 17F
就要看各自編譯器的設計了
01/26 14:35, 17F

01/31 11:24, 6年前 , 18F
這讓我想到C++當C寫的天兵
01/31 11:24, 18F
文章代碼(AID): #1SH_sAjB (C_and_CPP)