作者samuelcdf (溫泉龜)
看板C_and_CPP
標題Re: [問題] 能將指標拆成整數儲存嗎?
時間Wed Sep 1 00:24:29 2010
※ 引述《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