作者tinlans ( )
看板C_and_CPP
標題Re: [問題] 能將指標拆成整數儲存嗎?
時間Wed Sep 1 02:10:57 2010
※ 引述《samuelcdf (溫泉龜)》之銘言:
: 感謝原PO讓我增長見識.
: 補充一下, 原PO所說的 strict-aliasing rule 算是一種假設, 當此種假
: 設打開的時候, compiler能夠根據這個假設, 作進一步的最佳化. (在-O3時)
: 所以當自己寫的程式並不符合這個假設時, compiler作最佳化所產生的code,
: 可能會產生意料外的結果. 解決的方法就如原PO所寫的, 或是把這個假設關
: 閉.
: *strict-aliasing rule: 不同型態的指標, 不會指到同一個記憶體位置上
: 這邊有詳細說明:
: http://tinyurl.com/opgb56
: 心得:
: 想要讓compiler產生最佳化的code, 自己最好弄清楚compiler對程式碼
: 作了哪些假設. 不然最佳化最好不要開到最高等級 XD
事實上這個最佳化在 -O2 就已經開了。
只是你的 code 太簡單只有一個 main function 又只有一個編譯單元,
所以要觸發問題需要開到 -O3。
一般來說規模大一點的光開 -O2 就夠了。
這也是為什麼你編譯一些 open source 的程式時,
常看到 -fno-strict-aliasing 這參數會串在 -O2 後面。
至於你的心得...
原本我想說一個某對男女交往之後男生一直踩到女生地雷,
雖然男生每次踩到女生地雷都不會再犯第二次,
然而他總是可以踩到連女生自己都不見得知道的地雷,
最後搞到女生受不了終於在去年七夕跟他分手的故事。
但是這樣公開八卦別人的事情好像有失厚道,
而且要打很多字會打到天亮還不見得有人看得懂我想說什麼,
所以我想還是算了。
這個心得的問題在於你把焦點放到 compiler 這一層級上,
而不是放在更根本的語言標準層級上。
如果語言標準沒有允許 compiler 做這種假設,
compiler 也不會擅自做這麼大膽的假設去搞爛你的 code。
與其去個別瞭解 compiler 做了哪些假設,
倒不如去瞭解語言本身對你寫的 code 提供了多少保證。
否則很多事情永遠只能治標,
並不能治本。
雖然 strict aliasing 這名詞沒有出現在語言標準裡,
但 C99 規格書的 6.5 paragraph 7 (p.68) 說:
An object shall have its stored value accessed
only by an lvalue expression
that has one of the following types: 73)
- a type
compatible with the effective type of the object,
- a
qualified version of a type compatible with the effective type of
the object,
- a type that is the
signed or
unsigned type corresponding to
the effective type of the object,
- a type that is the
signed or
unsigned type corresponding to
a
qualified version of the effective type of the object,
- an
aggregate or
union type that includes
one of the aforementioned types
among its members (including, recursively, a member of a subaggregate or
contained union), or
- a
character type.
-------------------------
73) The intent of this list is to specify those circumstances in which
an object
may or may not be aliased.
如果你做了語言標準不是 100% 保證會怎樣的事,
那麼 compiler 會怎樣編譯你的 code 都不意外。
也許你現在手邊的 compiler 現在的確做了某些假設而你也完全瞭解,
但是下週或下個月裝了一個 update 後它的假設又變了。
如果你總是在忙著去重新瞭解你的 compiler 會做哪些假設,
我個人會覺得這是一個充滿著忙碌的人生。
當然這一切的一切都是看主角的個人喜好,
畢竟我也是認識不少人就是喜歡這麼忙碌地生活著。
所以我只會在一開始給一些建議,
並不會去強求什麼。
--
Ling-hua Tseng (uranus@tinlans.org)
Department of Computer Science, National Tsing-Hua University
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage:
http://www.tinlans.org
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.110.176
推 softwind:推~ 09/01 02:13
推 nowar100:本串收錄至 z-3-4-15 09/01 11:30
推 VictorTom:推觀念:) 09/01 21:33