據我瞭解,如果您使用std::make_shared
它創建引用計數對象與基礎對象同時。但是,如果由smart_ptr指向的對象指針大於56個字節,則無論如何,引用計數器最終都不會位於不同的高速緩存行中(因爲高速緩存行是64字節)?使用make_shared和shared_ptr <T> s僅對T <56字節有利?
2
A
回答
6
注:的高速緩存行不是每個平臺上相同的大小,也不是一個指針總是相同的尺寸..小心使得基於問題的數字假設。
std::make_shared
爲什麼?
std::make_shared
存在三個(主要)原因;
- 手段兩者的REF-計數器分配內存,並且對象在一次被跟蹤(通常的存儲器分配是昂貴的);
- 構造和初始化
std::shared_ptr
的異常安全方法; - 和代碼簡潔。
怎麼樣的高速緩存行和std::make_shared
?
老實說這是超出std::make_shared
的範圍和目的。 C++標準不知道「緩存行」是什麼,並且標準中描述的設計是寫在這樣的事情,它不是針對任何特定的平臺。
即使會有*的高速緩存MISSE * S因爲裁判櫃檯和對象不適合在同一高速緩存行裏面,我們仍然有前面列出的所有優點,並std::make_shared
仍做它打算解決的工作。
注:可以說,「保持REF-計數器和對象併攏記憶」只是一個可愛的小獎勵。
+0
'make_shared'的另一點是可以禁止'new'和'delete'。這本身就有價值。 – nwp
+3
@nwp肯定包含在「異常安全」的範圍之內';-)' –
相關問題
- 1. 如何使用make_shared <T>()替換所有shared_ptr <T>(new_w <T>)?
- 2. 的boost :: make_shared <T>(...)無法編譯,shared_ptr的<T>(新T(...))不
- 3. 使用來自存儲shared_ptr的shared_ptr <const T><T>
- 4. 的shared_ptr <T>到shared_ptr <T const>和矢量<T>到矢量<T const>
- 5. C++:std :: shared_ptr <T>和std :: shared_ptr <T const>有什麼區別?
- 6. 做boost :: shared_ptr <T>和boost :: shared_ptr <const T>分享引用計數?
- 7. shared_ptr <T> to const shared_ptr <const T>&
- 8. boost :: shared_ptr <const T> boost :: shared_ptr <T>
- 9. indirect_iterator for map <T,shared_ptr <U>>
- 10. 我應該使用boost :: ptr_vector <T>還是vector <boost :: shared_ptr <T>>?
- 11. Casting std :: shared_ptr <T> void *
- 12. 替換對shared_ptr中的對象的所有引用<T>
- 13. shared_ptr <>到數組定製刪除器(使用make_shared)
- 14. 鑄造的shared_ptr <T>到shared_ptr <void>
- 15. 轉換(隱含的)升壓shared_ptr的<T>到shared_ptr <const T>
- 16. 從boost :: shared_ptr的<T>轉換,以提高:: shared_ptr的<const T>
- 17. Casting std :: tr1 :: shared_ptr <T>和std :: shared_ptr <T>具有相同的功能但重載不同
- 18. 構造函數不能使用make_shared <T>()
- 19. C++ 11:當使用<code>shared_ptr</code><code>make_shared</code>構造</p> <p>,僅使用一個內存分配(分配內存:如何如果它是使用make_shared
- 20. VS2010的協調運行時和unbounded_buffer <shared_ptr <T>>,有什麼隱患?
- 21. 如何使用<S-Up>&<S-Down>在Terminal.app和VIM
- 22. 什麼是boost的shared_ptr(shared_ptr <Y> const&r,T * p)用於?
- 23. 僅當S和T不同時,Func <S, T>的T才從lambda表達式的輸出推斷出來?
- 24. CLOSED:無法確定sourceType的<S>和TARGETTYPE <T>
- 25. shared_ptr <T>如何檢測到T派生自enable_shared_from_this <T>?
- 26. 刪除的shared_ptr <const T>
- 27. 爲什麼要讓shared_ptr <T[N]>?
- 28. 像shared_ptr的隱式轉換<T>
- 29. 如何處理<s>和</s>計算單字LM?
- 30. 爲什麼使用Marshal.AlignedSizeOfStruct <T>代替SafeBuffer.WriteArray中的Marshal.SizeOfStruct <T><T>和SafeBuffer.ReadArray <T>?
'make_shared'的一點是內存分配很貴,所以我們應該這樣做一次 –
好了,所以它不保持對象和引用計數對象在內存中靠近在一起? – mezamorphic
這不是主要原因 –