2016-08-04 49 views
0

我想用一個類似指針的對象對於「所有權」和「引用」,不同類型的shared_ptr更好嗎?

Ownership<Type> m_foo

對所屬對象和處理

Reference<Type> m_someFoo

在另一種情況下一個經典的「指針」,而我參考應該知道原始對象何時不再存在(例如,通過返回nullptr),並且還應該可以防止原始對象在很短的一段時間內被刪除(鎖定)。

我知道shared_ptr的(所有權)和的weak_ptr(參考)提供類似的功能。然而,鎖定一個weak_ptr並訪問原始ptr涉及創建一個shared_ptr,這是相當緩慢的。另外,我不能決定在訪問原始ptr之前不鎖定weak_ptr(例如,在知道該對象現在沒有被刪除的情況下)。

是否明智實現所有權參考如下:

  • 所有權知道(如std::list<Reference<Type>*>
  • 當所有的對象衰減,這些公司參考 S的地址參考 s設置爲nullptr
  • 參考包含PTR到uint m_lockCount所有權
  • 在鎖定時,m_lockCount++,一旦解鎖m_lockCount--
  • 所有權不能釋放對象時m_lockCount != 0

這種解決方案將是特別少可行參考實例和高訪問率通過參考 s。

+1

「涉及創建相當慢的shared_ptr」。你知道爲什麼它很慢嗎?當擁有對象衰減時,這些引用被設置爲nullptr,引用包含所有權中的uint m_lockCount的ptr,在鎖定m_lockCount ++時,在解鎖m_lockCount時,所有權無法在m_lockCount!= 0時釋放對象。 另外,我敢打賭它比你想象的要快得多。 –

+5

你所描述的一切正是'shared_ptr'和'weak_ptr'被設計爲你處理的。按原樣使用它們,不要嘗試手動複製它們。鎖定一個'weak_ptr'確實會創建一個新的'shared_ptr',但是創建速度很快,因爲它共享原始'share_ptr'的數據指針,增加它的refcount直到複製的'shared_ptr'超出範圍。當鎖被激活時,refcounting的要點是快速複製並且不釋放擁有的對象。 –

+2

不要重新實施車輪。 –

回答

0

您提出的替代方案會比shared_ptr/weak_ptr慢得多,原因在於將std::list用於指向參考的後指針。如果你只在單線程模式下工作,那將是唯一的額外開銷。添加線程,你需要一個鎖來自動操縱你的引用計數和引用列表(儘管你有一個列表,你不需要計數)。 shared_ptr\weak_ptr向您的對象添加了一些指針開銷,並且沒有動態分配超過最初的分配。

+0

當然,創建和複製所有權和引用時,refcounting(請參閱shared/weak_ptr)是最快的。然而,取消引用常常是因爲它的行爲像一個指針,所以上面的方法更快。你是對的,我會需要它的名單。 – markusneg

+0

如果您的'Reference'類阻止'Ownership'類釋放基礎指針,那麼與使用'shared_ptr'的每個人都有什麼不同呢?如果不是這樣,那麼只要您遵守'Reference',就必須操縱鎖計數,在這一點上它不會與'weak_ptr'不同。 – nate

+0

只有當鎖被激活時,引用纔會阻止對象衰減。我仍然可以決定直接訪問引用中的ptr(可能不是線程安全但很快)或通過有條件增量操作(線程安全鎖計數增量)鎖定。後者應該比從shared_ptr創建weak_ptr更快(當然這應該被測試)。 – markusneg

相關問題