2012-11-19 24 views
30

Nếu kích thước của một lớp trống không thể là 0, ma thuật nào đang làm std :: tuple để sizeof của unique_ptr trả về 8 trong máy 64 bit?Làm thế nào có thể std :: unique_ptr không có kích thước trên không?

Trong unique_ptr thành viên được định nghĩa là:

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

đâu _Dp là lớp deleter.

Compiler là gcc phiên bản 4.7.1 (Debian 4.7.1-7)

+2

Điều này cũng có thể phụ thuộc vào việc triển khai thực hiện, vì vậy bạn có thể muốn bao gồm trình biên dịch bạn đang nói đến. –

+5

Tôi không chắc chắn cách 'std :: tuple' liên quan đến' std :: unique_ptr' trong câu hỏi của bạn. Bạn có thể làm rõ? – Cameron

+2

@Cameron, _M_t là loại cơ bản trên unique_ptr. – piotr

Trả lời

43

Lý do là typename _Dp = default_delete<_Tp> là một lớp trống và mẫu tuple sử dụng tối ưu hóa lớp cơ sở trống.

Nếu bạn khởi tạo unique_ptr bằng cách xóa mặc định, bạn sẽ thấy tăng kích thước.

+10

Để rephrase một chút: khi instantiated của chính nó, một lớp học phải có kích thước khác 0, nhưng khi instatiated như là một lớp cơ sở, kích thước không được phép. –

+0

Liên quan: http://www.stroustrup.com/bs_faq2.html#sizeof-empty –

28

unique_ptr theo quy định có thể có không phí tổn vì điều duy nhất cần thiết để thực hiện nó là thay đổi quá trình sao chép/di chuyển một con trỏ thô ; không cần thêm thông tin. Do đó unique_ptr không cần lưu trữ bất cứ thứ gì ngoài con trỏ và có thể có cùng kích thước với con trỏ.

Cách triển khai cụ thể của bạn, đạt được điều đó; Chỉ các loại có nguồn gốc nhất cần phải có kích thước lớn hơn 0. Các lớp cơ sở trống có thể chiếm không byte. Nó khá phổ biến cho việc triển khai thư viện chuẩn để tận dụng lợi thế của cái gọi là 'lớp cơ sở trống' tối ưu hóa cho tất cả các loại sự vật, từ những người cấp phát không trạng thái trong các thùng chứa đến bộ dữ liệu.

+0

Cảm ơn câu trả lời, đã bình chọn +1 Tôi chấp nhận thư giãn vì anh ấy có điểm số thấp hơn và cũng cung cấp câu trả lời hợp lệ. – piotr

Các vấn đề liên quan