2011-04-11 38 views
18

Theo C++ 4th edition Primer, trang 755, có một lưu ý rằng:C++ STL cấp phát vs điều hành mới

Modern C++ chương trình thường phải sử dụng lớp cấp phát để cấp phát bộ nhớ. Đó là an toàn hơn và nhiều hơn nữa.

Tôi không hiểu rõ tuyên bố này. Cho đến nay tất cả các tài liệu tôi đã đọc dạy sử dụng new để cấp phát bộ nhớ trong C++. Ví dụ về cách phân bổ sử dụng lớp vectơ được hiển thị trong sách. Tuy nhiên, tôi không thể nghĩ ra các kịch bản khác.

Có ai có thể giúp làm rõ tuyên bố này không? và cho tôi nhiều ví dụ hơn? Khi nào tôi nên sử dụng người cấp phát và khi nào nên sử dụng new? Cảm ơn!

Trả lời

35

Để lập trình chung, bạn nên sử dụng newdelete.

Tuy nhiên, nếu bạn đang viết thư viện, bạn không nên! Tôi không có sách giáo khoa của bạn, nhưng tôi tưởng tượng nó đang thảo luận về người cấp phát trong ngữ cảnh viết mã thư viện.

Người dùng thư viện có thể muốn kiểm soát chính xác những gì được phân bổ từ đâu. Nếu tất cả các phân bổ của thư viện đã trải qua newdelete, người dùng sẽ không có cách nào để có cấp độ kiểm soát chi tiết đó.

Tất cả các vùng chứa STL lấy một đối số mẫu cấp phát tùy chọn. Sau đó, vùng chứa sẽ sử dụng bộ cấp phát đó cho các nhu cầu bộ nhớ trong của nó. Theo mặc định, nếu bạn bỏ qua trình phân bổ, nó sẽ sử dụng std::allocator sử dụng newdelete (cụ thể, ::operator new(size_t)::operator delete(void*)).

Bằng cách này, người dùng của vùng chứa đó có thể kiểm soát nơi bộ nhớ được cấp phát nếu họ muốn.

Ví dụ về thực hiện một cấp phát tùy chỉnh để sử dụng với STL, và giải thích: Improving Performance with Custom Pool Allocators for STL

Side Lưu ý: Cách tiếp cận STL để allocators là không tối ưu bằng nhiều cách. Tôi khuyên bạn nên đọc Towards a Better Allocator Model để thảo luận về một số vấn đề đó.

+4

+1 cho "cách tiếp cận STL cho người cấp phát không tối ưu" cộng với liên kết tới "Hướng tới mô hình phân bổ tốt hơn" :) –

+1

Liên kết bạn cung cấp rất hữu ích! –

1

Cả hai không mâu thuẫn. Allocators là một PolicyPattern hoặc StrategyPattern được sử dụng bởi bộ điều hợp container của thư viện STL để phân bổ các khối bộ nhớ để sử dụng với các đối tượng.

Những allocators thường xuyên tối ưu hóa cấp phát bộ nhớ bằng cách cho phép * phạm vi của các yếu tố để được phân bổ cùng một lúc, và sau đó khởi tạo sử dụng một vị trí mới * mục được lựa chọn từ, đống chuyên ngành thứ tùy thuộc vào kích cỡ khối

Một cách hoặc cách khác, kết quả cuối cùng sẽ (hầu như luôn luôn) là các đối tượng được phân bổ mới (vị trí hoặc mặc định)


Ví dụ sinh động khác sẽ là ví dụ tăng thư viện thực hiện smartpointers. Bởi vì smartpointers là rất nhỏ (với ít chi phí) chi phí phân bổ có thể trở thành một gánh nặng. Nó sẽ làm cho ý nghĩa đối với việc thực hiện để xác định một cấp chuyên ngành để thực hiện phân bổ, vì vậy người ta có thể có hiệu quả std :: set <> của smartpointers, std :: map < ..., smartpointer> vv

(Bây giờ Tôi gần như chắc chắn rằng tăng thực sự tối ưu hóa lưu trữ cho hầu hết các smartpointers bằng cách tránh bất kỳ virtuals, do đó vft, làm cho lớp một cấu trúc POD, chỉ với con trỏ thô như là lưu trữ, một số ví dụ sẽ không áp dụng. đối với các loại smartpointer khác (truy cập smartpointers, con trỏ tới các hàm thành viên, con trỏ tới các hàm thành viên với tham chiếu mẫu, v.v.))