2012-11-19 46 views
30

如果一個空類的大小不能爲0,那麼std :: tuple有什麼魔力,所以unique_ptr的sizeof在64位機器中返回8?std :: unique_ptr沒有尺寸開銷?

在的unique_ptr的構件定義爲:

typedef std::tuple<typename _Pointer::type, _Dp> __tuple_type;     
    __tuple_type _M_t; 

凡_DP是刪除器類。

編譯爲指定可以具有零的開銷,因爲唯一需要實現它是修改複製過程/移動原始指針gcc版本4.7.1(Debian的4.7.1-7)

+2

這也可能是依賴於實現的,因此您可能還想包括您正在討論的編譯器。 –

+5

我不知道你的問題中'std :: tuple'與'std :: unique_ptr'有什麼關係。你能澄清嗎? – Cameron

+2

@Cameron,_M_t是unique_ptr上的基礎類型。 – piotr

回答

43

原因是typename _Dp = default_delete<_Tp>是一個空類,tuple模板採用空基類優化。

如果使用非默認刪除實例化unique_ptr,您應該看到大小增加。

+10

要重新說明一點:當它自己實例化時,類必須具有非零大小,但是當作爲基類安裝時,允許爲零大小。 –

+0

相關:http://www.stroustrup.com/bs_faq2.html#sizeof-empty –

28

unique_ptr ;沒有額外的信息是必要的。因此unique_ptr不需要存儲除指針之外的任何內容,並且可以與指針的大小相同。

至於你的具體實現是如何實現的;只有大多數派生類型需要大於零的大小。空的基類可佔用零字節。標準庫實現對於從容器中的無狀態分配器到元組的所有類型的事情,利用所謂的「空基類」優化是很常見的。

+0

感謝您的答覆,投票+1我接受寒意,因爲他有更少的分數,並提供了有效的答案。 – piotr