Dot-Net
GC 移動對象時 Object.GetHashCode 是如何工作的?
如果我理解正確,在 .NET 中,預設實現會
Object.GetHashCode()根據對象的記憶體地址返回一個值(至少對於引用類型而言)。但是,垃圾收集器可以自由地在記憶體中移動對象。大概雜湊碼不會僅僅因為 GC 移動一個對象而改變,那麼這種互動是否有特殊處理,或者我的假設是錯誤的?
它不會根據地址返回值。它根據對象的同步塊返回一個值。
同步塊是在第一次
object.GetHashCode被呼叫時分配的(當沒有被覆蓋時)或者對象的鎖存在爭用。(如果你也呼叫Wait/Pulse/PulseAll可能會分配,我沒看過。)同步塊獨立於對象的主要數據在記憶體中的位置。基本上(據我了解)有一個用於同步塊的大表 - 它以某種方式保持高效,部分原因是並非每個對像都需要一個(僅需要係統雜湊碼或鎖定的對象)。