看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《tinlans ( )》之銘言: (恕刪) : > gcc -v : Using built-in specs. : Target: x86_64-portbld-freebsd8.1 : Thread model: posix : gcc version 4.4.5 20100720 (prerelease) (GCC) : > gcc -O3 -Wall test.c -o test : test.c:11: warning: dereferencing pointer 'p' does break strict-aliasing rules : test.c:5: note: initialized from here : test.c:12: warning: dereferencing pointer '({anonymous})' does break : strict-aliasing rules : test.c:12: note: initialized from here : > ./test : Sizeof int*: 8 : Sizeof int: 4 : 0x7fffffffe86c : [FFFFE8A0] : [00007FFF] : 如果想要拿 pointer 拆這種東西, : 最保險的方法是轉成 char * 去慢慢爬。 : 因為往 char * 的 casting 有特殊規則在, : aliasing 的關係不會因為 pointer type 不同而自動消滅。 : union 的解法雖然標準沒有保證, : 不過大部分的 compiler 都支援那種技巧。 : 所以你大部分看到的可能還是拿 union 去拆。 感謝原PO讓我增長見識. 補充一下, 原PO所說的 strict-aliasing rule 算是一種假設, 當此種假 設打開的時候, compiler能夠根據這個假設, 作進一步的最佳化. (在-O3時) 所以當自己寫的程式並不符合這個假設時, compiler作最佳化所產生的code, 可能會產生意料外的結果. 解決的方法就如原PO所寫的, 或是把這個假設關 閉. *strict-aliasing rule: 不同型態的指標, 不會指到同一個記憶體位置上 這邊有詳細說明: http://tinyurl.com/opgb56 心得: 想要讓compiler產生最佳化的code, 自己最好弄清楚compiler對程式碼 作了哪些假設. 不然最佳化最好不要開到最高等級 XD -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.51.239
loveme00835:記更通用的解法比較簡單 ~"~ 09/01 00:39
samuelcdf:是的. 只是把詳細原因分享一下而已 09/01 00:59