看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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