![](/img/trans.png)
[英]I which situation will std::map<A,B> be faster than sorted std::vector<std::pair<A,B>>?
[英]Is ++(a = b); faster than a = b + 1;?
使用++(a = b);
是否更快++(a = b);
而不是a = b + 1;
?
據我了解,第一種方法包括以下操作:
b
的值移到a
a
內存 而第二種方法是:
b
和1
推入堆棧 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
。
雖然的
值計算
a
在
a = b
時的修改前測序
a
由於
++
,的副作用
a = b
(存儲到
a
)相對於的副作用未測序
++
(再次,存儲到
a
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.