Tại sao heap runtime được sử dụng để cấp phát bộ nhớ động trong các ngôn ngữ kiểu C và cấu trúc dữ liệu được gọi là "heap"? Có một số mối quan hệ?
Tại sao heap runtime được sử dụng để cấp phát bộ nhớ động trong các ngôn ngữ kiểu C và cấu trúc dữ liệu được gọi là "heap"? Có một số mối quan hệ?
Câu trả lời:
Donald Knuth nói (Nghệ thuật lập trình máy tính, Ed lần thứ ba, Tập 1, trang 435):
Một số tác giả bắt đầu khoảng năm 1975 để gọi nhóm bộ nhớ khả dụng là "đống".
Ông không nói tác giả nào và không đưa ra tài liệu tham khảo cho bất kỳ bài viết cụ thể nào, nhưng không nói rằng việc sử dụng thuật ngữ "heap" liên quan đến hàng đợi ưu tiên là ý nghĩa truyền thống của từ này.
Chúng có cùng tên nhưng chúng thực sự không giống nhau (thậm chí về mặt khái niệm). Một đống bộ nhớ được gọi là một đống theo cùng một cách bạn sẽ gọi một giỏ giặt là "đống quần áo". Tên này được sử dụng để chỉ một nơi hơi lộn xộn, nơi bộ nhớ có thể được phân bổ và giải quyết theo ý muốn. Cấu trúc dữ liệu (như liên kết Wikipedia mà bạn tham chiếu chỉ ra) khá khác nhau.
Sự va chạm tên là không may, nhưng không phải là tất cả bí ẩn. Heap là một từ nhỏ, phổ biến được sử dụng để chỉ một đống, bộ sưu tập, nhóm, v.v ... Việc sử dụng từ này cho cấu trúc dữ liệu trước ngày (tôi khá chắc chắn) tên của nhóm bộ nhớ. Trong thực tế, pool sẽ là một lựa chọn tốt hơn nhiều cho cái sau, theo ý kiến của tôi. Heap bao hàm một cấu trúc dọc (giống như một đống), phù hợp với cấu trúc dữ liệu, nhưng không phải là nhóm bộ nhớ. Chúng ta không nghĩ rằng một đống bộ nhớ là phân cấp, trong khi ý tưởng cơ bản đằng sau cấu trúc dữ liệu là giữ phần tử lớn nhất ở đầu heap (và heap phụ).
Heap cấu trúc dữ liệu có từ giữa những năm 60; đống bộ nhớ, đầu những năm 70 Thuật ngữ heap (có nghĩa là nhóm bộ nhớ) đã được sử dụng ít nhất là vào năm 1971 bởi Wijngaarden trong các cuộc thảo luận về Algol.
Có thể việc sử dụng heap sớm nhất như một cấu trúc dữ liệu được tìm thấy bảy năm trước đó trong
Williams, JWJ 1964. "Thuật toán 232 - Heapsort", Truyền thông của ACM 7 (6): 347-348
Trên thực tế, đọc về cách phân bổ bộ nhớ (xem Khối Buddy ) nhắc nhở tôi về một đống trong cấu trúc dữ liệu.
IMO nó chỉ đơn thuần là một tai nạn / sự trùng hợp ngẫu nhiên mà hai thứ hoàn toàn không liên quan này có cùng tên. Nó giống như đồ thị và đồ thị .
Cấu trúc dữ liệu giống như đống được sử dụng bởi thuật toán tìm phân bổ bộ nhớ có sẵn. Sau đây được trích từ http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .
Khi
new
được gọi, nó bắt đầu tìm kiếm một khối bộ nhớ miễn phí phù hợp với kích thước cho yêu cầu của bạn. Giả sử rằng một khối bộ nhớ như vậy được tìm thấy, nó được đánh dấu là dành riêng và một con trỏ đến vị trí đó được trả về. Có một số thuật toán để thực hiện điều này bởi vì phải thỏa hiệp giữa việc quét toàn bộ bộ nhớ để tìm khối tự do nhỏ nhất lớn hơn kích thước của đối tượng của bạn hoặc trả lại khối đầu tiên nơi bộ nhớ cần phù hợp. Để cải thiện tốc độ lấy một khối bộ nhớ, các vùng bộ nhớ trống và dành riêng được duy trì trong cấu trúc dữ liệu tương tự như cây nhị phân gọi là heap.
Các thuật ngữ thông tục ngăn xếp bộ nhớ ngăn xếp và bộ nhớ heap không được sử dụng trong tiêu chuẩn C ++. Tiêu chuẩn sử dụng lưu trữ tĩnh, lưu trữ luồng, lưu trữ tự động và lưu trữ động.
Nhiều hơn có thể được tìm thấy tại phần Storage Duraction của tiêu chuẩn.
Do đó, từ quan điểm của ngôn ngữ và thư viện tiêu chuẩn, không có sự nhầm lẫn.
Q. một đống là gì? A. Một đống là một tập hợp các đối tượng đặt chồng lên nhau.
Trả lời cho câu hỏi của bạn: Cả heap bộ nhớ và heap nhị phân đều sử dụng cùng một khái niệm như bạn biết. Dữ liệu được lưu trữ dưới dạng một đống trong bộ nhớ theo thứ tự như được ghi trong chương trình trong khi heap nhị phân là một cấu trúc dữ liệu theo cùng một khái niệm lưu trữ dữ liệu theo cách có thứ tự dưới dạng heap (Dữ liệu trên cùng của những thứ còn lại). Hãy cho tôi biết những gì bạn nghĩ trong phần bình luận.
Có lẽ heap bộ nhớ đầu tiên được thực hiện được quản lý bởi một cấu trúc heap?