2014-05-21 50 views
2

據我瞭解,如果您使用std::make_shared它創建引用計數對象與基礎對象同時。但是,如果由smart_ptr指向的對象指針大於56個字節,則無論如何,引用計數器最終都不會位於不同的高速緩存行中(因爲高速緩存行是64字節)?使用make_shared和shared_ptr <T> s僅對T <56字節有利?

+5

'make_shared'的一點是內存分配很貴,所以我們應該這樣做一次 –

+0

好了,所以它不保持對象和引用計數對象在內存中靠近在一起? – mezamorphic

+0

這不是主要原因 –

回答

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肯定包含在「異常安全」的範圍之內';-)' –

相關問題