在類別的標準複製賦值運算子中,通常的做法是檢查分配的物件是否是與呼叫物件相同,使用if (this != &rhs) 以避免更改呼叫物件。但是,這種檢查對於移動賦值運算子來說是必要的嗎?
移動賦值運算符,由operator=(Class&&)表示,旨在有效地轉移資源的所有權從一個物體到另一個物體。與副本分配不同,它避免了創建物件的新副本的需要。
這個可以== &rhs嗎?
問題出現了,在移動分配中== &rhs 是否可以為真
物件綁定到右值引用有兩種情況:
第一種情況,因為該物件是臨時物件的唯一引用,這 == &rhs 是不可能的。在第二種情況下,呼叫者有責任確保 this != &rhs,從而使檢查變得不必要。
作者認為 if (this != &rhs) 檢查是多餘的,因為:
省略此檢查,可以在物件頻繁從自身移出和分配給自己的情況下提高效能。
然而,有些人認為 this != &rhs檢查仍然是必要的,以防止自我移動分配。他們認為允許 swap(x, x) 作為有效操作可能會觸發此檢查。
作者的結論是:
複製並移動分配後置條件:
自移動分配實作:
為了實現這一點,提供了像dumb_array 這樣的類別中移動賦值運算子的三種可能的實作:
1.執行檢查以區分self-move-assignment,先前物件被設定為有效狀態
2. 忽略簽入,使自移動分配成為無操作。
3. 交換(其他) ) 方法被使用,前提是該類別不持有應立即釋放的資源。
作者強調,最好的實作取決於特定的類別設計、硬體特性和效能要求。
如果類別不直接管理內存,建議使用operator=(Class& &) = 預設值;在基本異常安全的情況下實現最高效能。
以上是移動賦值運算子中的「if (this != &rhs)」檢查是否必要?的詳細內容。更多資訊請關注PHP中文網其他相關文章!