Re: [問題] c++ 和 ++c 的差別在哪裡

看板C_and_CPP作者 (移動中...)時間11年前 (2014/03/25 08:44), 編輯推噓9(904)
留言13則, 8人參與, 最新討論串2/2 (看更多)
※ 引述《kobedokobe (科比督科比)》之銘言: : 之前看到一本討論C++寫法的書 : 裡面提到 : 如果 c++ 和++c 在程式中作用一樣的話 : 寫 ++c 會比較好 : 也就是說 prefix increment 比 postfix increment 寫法還好 : 但書中沒有提到原因 : 想請問它們到底差在哪裡? 因為寫前序比較直覺 a = c++; 一式 a = ++c; 二式 第一式的a與c值不一樣 第二式的a與c值相同 所以寫第二式比較不會出現程式缺陷 現在要問的 (intel) CPU運行第一式還是第二式快 答案是第一式 因為在組語中是這樣的 (為好讀 a, c還是寫成a, c) 第一式: MOV EAX, c; MOV a, EAX; INC EAX; MOV c, EAX; 第二式: MOV EAX, c; INC EAX; MOV a, EAX; MOV c, EAX; 其中黃色是可以同時做的 我們在寫組語時 會覺的寄存器(register)是唯一 這樣其實個假像 其實CPU內部根本不會去分EAX, EBX... 這機制叫寄存器重命名 更重要的,X86寄存器根本不是只有 EAX, EBX...等八個 具體幾個,是要看花多少錢來買CPU來決定 CPU看到指令後 會分配內部寄存器去運行指令 運行的方式不是一行一行做 是一次抓數行指令一起幹 後面再有個機制去評斷做出來的結果是否有效 做對就下回合跳過;做錯就下回合再幹次 簡單講,就是吃定不可能每行指令都有相依性 一定有可以同時幹還會對的狀況 如上面兩例 若一次抓後三行 例一 抓起來是前兩行對 最後一行錯 例二 因為有INC這指令 造成抓起來的只有INC這行有效 這抓起來一起幹的機制叫亂數運行 至於一次抓多少 一樣是由花多少錢買CPU決定 一堆廢言 總之就是寫後序會比較好 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.176.104.49

03/25 08:59, , 1F
好文推!
03/25 08:59, 1F
※ 編輯: Move192 來自: 180.176.104.49 (03/25 09:46)

03/25 10:10, , 2F
好不好讀見人見智,但速度上真的沒差(對int來說)
03/25 10:10, 2F

03/25 10:50, , 3F
a=c++ 和 a=++c 是不同的喔 原本應該是在講loop中的++i
03/25 10:50, 3F

03/25 11:30, , 4F
不過這種程度的東西compiler也知道,交給他就好了
03/25 11:30, 4F

03/25 12:30, , 5F
當程式有了上下文, 又開了最佳化, 是否還有差異就難說了.
03/25 12:30, 5F

03/25 13:02, , 6F
03/25 13:02, 6F

03/30 10:52, , 7F
頗有趣XD
03/30 10:52, 7F

03/30 22:56, , 8F
如果a,c都是 int 其實沒差,如果是class就有差了
03/30 22:56, 8F

03/30 22:57, , 9F
例如你使用iterator跑迴圈的時候,c++會產品臨時物件
03/30 22:57, 9F

03/30 22:58, , 10F
印象中應該是這樣
03/30 22:58, 10F

03/30 22:59, , 11F
產生臨時物件,手殘打錯
03/30 22:59, 11F

04/01 17:44, , 12F
a=c++ 是先做a=c之後才做c+1的動作
04/01 17:44, 12F

04/01 17:45, , 13F
a=++c 則是先把c+1之後 再把值 指定給a
04/01 17:45, 13F
文章代碼(AID): #1JCD5boI (C_and_CPP)
文章代碼(AID): #1JCD5boI (C_and_CPP)