簡體   English   中英

是++(a = b); 快於a = b + 1;

[英]Is ++(a = b); faster than a = b + 1;?

使用++(a = b);是否更快++(a = b); 而不是a = b + 1;

據我了解,第一種方法包括以下操作:

  1. b的值移到a
  2. 增加a內存

而第二種方法是:

  1. b1推入堆棧
  2. 呼叫添加
  3. 將結果彈出到寄存器
  4. 移動寄存器a

它實際上需要更少的周期嗎? 還是編譯器(例如gcc)進行了優化,以至於沒有影響?

編輯:直到至少在C ++ 11之前,才知道++(a=b) 錯誤的非法 UB。 盡管如此,我將在合法的情況下討論這個問題,或者編譯器會按照您的期望進行操作。

一般來說, a = b + 1; 是比較快的。

優化器肯定會使兩者相同。 如果不是這樣,則很可能會優化第二個版本,因為這是編寫的非常常見的事情,而且與怪異的極端情況相比,優化器更容易識別常見的事情。

為什么我說優化后應該相同,但是第二個更快? 因為開發者的同伴。 每個人都認識到a = b + 1; 立即。 沒人真正要考慮它。 另一種情況更可能引發類似“ wtf他那兒做什么為什么嗎?”之類的反應。 很多人會找出你做了什么 ,最終出現。 有些不會。 有些人甚至可能因此引入錯誤。 很少人會發現,你為什么這樣做,並在每次要讀該行的時間仍然蹣跚。 每個人在閱讀那條線時都會浪費時間去思考。 這就是為什么另一個更快的原因。

注意:假設您正在談論內置類型(例如int或指針),所有這些都是無提示地編寫的。 您對兩者的作用的解釋支持了這一點。 如果我們談論的是UDT,則甚至不能保證這兩行都做相同的事情。 然后,這完全取決於如何實現operator=operator++operator+以及從int進行的轉換。 但是,如果實現讓您考慮編寫++(a=b) ,則它們很可能是糟糕的實現,應該加以改進而不是亂搞。

tl; dr:如果我發現您在我使用的任何代碼庫中都做++(a=b) ,我們必須認真談一談;-)

這個問題沒有簡單的答案。 這個問題已經用C ++進行了標記,因此在不知道所有操作數的確切類型的情況下,我們無法知道此代碼的實際作用。 同樣,代碼出現的上下文將與優化器生成代碼的方式有所不同-編譯器可以對變量進行別名化,並將增量移入指令,使其在程序的更下方,例如,進入兩個變量的有效地址計算。

但真正的問題是,您為什么在乎? 正如Arne所說,可讀性要重要得多,您還沒有發布任何差異都可以衡量的方案。

僅在確實引起問題時才擔心它。

啟用優化后,它們會為我生成完全相同的代碼,因此它們將執行完全相同的代碼。 這並不奇怪,因為兩個語句的效果完全相同。

++(a = b); 是不確定的行為,因為有兩個未測序修改 a

\n

雖然的 值計算 aa = b時的修改前測序 a由於 ++ ,的副作用 a = b (存儲到 a )相對於的副作用未測序 ++ (再次,存儲到 a )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM