2015-11-07 11 views
8

Ví dụ unique_ptr (không có dấu phân cách tùy chỉnh) có cùng dấu vết bộ nhớ dưới dạng con trỏ thô hay không lưu trữ một cá thể nhiều hơn chỉ là con trỏ?Dấu chân bộ nhớ của unique_ptr

+2

Đó là một câu hỏi rất cụ thể về triển khai và do đó có thể khác nhau rất nhiều giữa các thư viện chuẩn khác nhau. Nhưng đối với một kiểm tra đơn giản tại sao không sử dụng 'sizeof' để kiểm tra và so sánh với một con trỏ thô? –

+1

@JoachimPileborg Bởi vì tôi nghĩ những người khác có thể có cùng một câu hỏi trong tương lai. Điểm tốt. Về mặt kỹ thuật, tôi nên hỏi: "Có thể * có thể * để thực hiện' unique_ptr' với cùng một dấu vết bộ nhớ như một con trỏ thô "như việc triển khai có thể sẽ làm điều này nếu có thể. – Museful

+0

câu trả lời là ở đây: http://stackoverflow.com/a/13460653/2183287 –

Trả lời

7

Như @JoachimPileborg đề nghị, với GCC 4.8 (x64) mã này

std::cout << "sizeof(unique_ptr) = " << sizeof(std::unique_ptr<int>) << '\n'; 

sản xuất sản lượng này:

sizeof (unique_ptr) = 8

Vì vậy, dưới đây triển khai, câu trả lời là .

Đây không phải là đáng ngạc nhiên: sau khi tất cả, unique_ptr không thêm tính năng -con trỏ nguyên (ví dụ một bộ đếm như shared_ptr không Trong thực tế, nếu tôi in sizeof(shared_ptr<int>) kết quả lần này là 16.). unique_ptr sẽ chăm sóc cho bạn về một số khía cạnh của quản lý con trỏ.

Bằng cách này, là unique_ptr khác với mã nguyên bản, mã được tạo sẽ khác nhau khi sử dụng một hoặc một mã khác. Cụ thể, nếu unique_ptr vượt quá phạm vi trong mã của bạn, trình biên dịch sẽ tạo mã cho hàm hủy của chuyên môn cụ thể đó và nó sẽ sử dụng mã đó mỗi lần unique_ptr loại đó sẽ bị hủy (và đó là chính xác những gì bạn muốn).

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