[英]How can std::unique_ptr have no size overhead?
如果一個空類的大小不能為0,那么什么是魔術在做std :: tuple,那么unique_ptr的sizeof在64位機器上返回8?
在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)
原因是typename _Dp = default_delete<_Tp>
是一個空類,而tuple
模板使用了空基類優化。
如果使用非默認刪除實例化unique_ptr
,則應該看到大小增加。
指定的unique_ptr
開銷可以為零,因為實現它的唯一需求就是修改復制/移動原始指針的過程。 無需其他信息。 因此, unique_ptr
不需要存儲除指針以外的任何內容,並且可以與指針大小相同。
至於您的特定實現是如何實現的; 只有大多數派生類型的大小都必須大於零。 空的基類可以占用零字節。 標准庫實現對從容器中的無狀態分配器到元組的所有事物利用所謂的“空基類”優化是很常見的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.