C ++, Free-Store so với Heap


124

Phân bổ động với new/deleteđược cho là diễn ra trên cửa hàng miễn phí ,
trong khi các malloc/freehoạt động sử dụng heap .

Tôi muốn biết nếu có sự khác biệt thực sự, trong thực tế.
Các trình biên dịch có phân biệt được hai thuật ngữ này không? ( Cửa hàng miễn phíHeap , không phải new/malloc)

Câu trả lời:


76

Xem http://www.gotw.ca/gotw/009.htm ; nó có thể mô tả sự khác biệt giữa heap và cửa hàng miễn phí tốt hơn nhiều so với tôi có thể:

Cửa hàng miễn phí:

Kho lưu trữ miễn phí là một trong hai vùng nhớ động, được cấp phát / giải phóng bởi new / delete. Thời gian tồn tại của đối tượng có thể nhỏ hơn thời gian lưu trữ được cấp phát; nghĩa là, các đối tượng lưu trữ miễn phí có thể được cấp phát bộ nhớ mà không cần được khởi tạo ngay lập tức và có thể bị phá hủy mà không cần phân bổ bộ nhớ ngay lập tức. Trong khoảng thời gian bộ nhớ được cấp phát nhưng nằm ngoài vòng đời của đối tượng, bộ lưu trữ có thể được truy cập và thao tác thông qua khoảng trống * nhưng không có thành viên hoặc hàm thành viên không tĩnh nào của đối tượng proto có thể được truy cập, lấy địa chỉ của chúng hoặc bị thao túng theo cách khác .

Đống:

Heap là vùng bộ nhớ động khác, được phân bổ / giải phóng bởi malloc / free và các biến thể của chúng. Lưu ý rằng trong khi toàn cục mới và xóa mặc định có thể được thực hiện theo malloc và miễn phí bởi một trình biên dịch cụ thể, heap không giống như kho lưu trữ miễn phí và bộ nhớ được phân bổ trong một khu vực không thể được phân bổ an toàn trong khu vực khác. Bộ nhớ được cấp phát từ heap có thể được sử dụng cho các đối tượng thuộc loại lớp theo vị trí-xây dựng mới và phá hủy rõ ràng. Nếu được sử dụng như vậy, các lưu ý về thời gian tồn tại của đối tượng cửa hàng miễn phí cũng áp dụng tương tự ở đây.


23
Tôi không đồng ý. Từ "heap" trong ngữ cảnh phân bổ động không được sử dụng bởi tiêu chuẩn C ++ hay C99 (tôi không có C89 mà C ++ đề cập đến, vui lòng sửa cho tôi nếu nó sử dụng từ này). Tôi không thể tìm thấy ngày mà GotW được đề cập được xuất bản, nhưng vì nó nói về bản nháp nên rõ ràng là nó đã được chuẩn trước.
avakar

2
Đây là tất cả các câu hỏi về thuật ngữ, imho. Nói đi, ông. Stroustrup không phân biệt 'heap' và 'free store': stroustrup.com/Programming/17_free_store.ppt , slide 12. 'Heap' đã được sử dụng như một từ đồng nghĩa của bộ nhớ động từ lâu trước C ++, kể từ thời Lisp (những năm 1960). cấu trúc dữ liệu đống để cấp phát bộ nhớ.
Alexey Voytenko

Tôi thường nghĩ về heap (thông qua maloc / miễn phí) như một loại nhà cung cấp nguyên liệu thô. Bạn yêu cầu một đoạn bộ nhớ mà bạn nhận được không hề rườm rà. Bạn phải tự xây dựng bất kỳ cấu trúc nào. Cửa hàng Miễn phí (mới / xóa) giống một nhà cung cấp 'hàng hóa thành phẩm' hơn. Bạn yêu cầu một đối tượng và nó được phân bổ một số không gian, và đối tượng mà nó xây dựng và chuẩn bị cho bạn sử dụng. Khi nó hoàn thành với nó sẽ được dọn dẹp sạch sẽ.
Anshuman Kumar

67

Đối với C ++, sự khác biệt giữa kho lưu trữ miễn phí và heap đã trở thành khái niệm thuần túy. Giống như một cái lọ để thu thập lỗi và một cái để thu thập cookie. Một được dán nhãn theo cách này, cách khác. Việc chỉ định này có nghĩa là bạn KHÔNG BAO GIỜ kết hợp " new" và " delete" với " malloc", " realloc" hoặc " free" (hoặc bộ mức bit cho vấn đề đó).

Trong các cuộc phỏng vấn, thật tốt khi nói rằng " newdeletesử dụng cửa hàng miễn phí, mallocfreesử dụng heap; newdeletegọi hàm tạo và hủy tương ứng, tuy nhiên mallocfreekhông." Tuy nhiên, bạn sẽ thường nghe nói rằng các phân đoạn bộ nhớ thực sự nằm trong cùng một khu vực - tuy nhiên, điều đó CÓ THỂ là trình biên dịch cụ thể, có nghĩa là, có thể cả hai đều có thể chỉ định các không gian bộ nhớ khác nhau làm nhóm (không chắc chắn tại sao nó sẽ như vậy, Tuy nhiên).


28

Câu trả lời của Mike Koval bao hàm lý thuyết khá tốt. Tuy nhiên, trên thực tế, chúng hầu như luôn luôn là cùng một vùng bộ nhớ - trong hầu hết các trường hợp, nếu bạn tìm hiểu sâu về cách triển khai của trình biên dịch new, bạn sẽ thấy nó được gọi malloc().

Nói cách khác: theo quan điểm của máy, heap và free store là một thứ giống nhau. Sự khác biệt tồn tại bên trong trình biên dịch.

Để làm cho mọi thứ trở nên khó hiểu hơn, trước khi C ++ ra đời, chúng tôi đã nói "heap" có nghĩa là cái mà bây giờ được gọi là "cửa hàng miễn phí".


5

Thuật ngữ "heap" cũng có thể đề cập đến một cấu trúc dữ liệu cụ thể, nhưng trong ngữ cảnh của C ++ malloc, các hoạt động miễn phí, mới và xóa, các thuật ngữ "heap" và "free store" được sử dụng thay thế cho nhau ít nhiều.


3

Heap và cửa hàng miễn phí không được phép tương tác với nhau. Trong các ngữ cảnh hạn chế như trong bộ điều khiển vi mô AVR 8-bit với Thư viện chuẩn c ++ 11, chúng thậm chí không thể được sử dụng trong cùng một chương trình. Kho lưu trữ miễn phí và heap thực hiện phân bổ của chúng trong cùng một không gian bộ nhớ, ghi đè lên các cấu trúc và dữ liệu khác. Trong ngữ cảnh này, Free store khác và không tương thích với Heap vì "thư viện lưu trữ miễn phí mới / xóa" đơn giản hơn (và nhanh hơn) so với "Malloc / free / realloc / calloc heap library" và do đó cung cấp mức tăng sử dụng bộ nhớ lớn cho Lập trình viên nhúng C ++ (trong bối cảnh bạn chỉ có 512 byte RAM).

Xem Thư viện chuẩn 8-bit c ++ 11/14 tại https://github.com/ambroise-leclerc/ETL/tree/master/libstd


2

Tôi không nhớ tiêu chuẩn đã từng đề cập đến từ heap, ngoại trừ trong các mô tả về các hàm heap như push_heapet al. Tất cả các phân bổ động được thực hiện trên cửa hàng miễn phí.


1

Free Store là một tập hợp bộ nhớ heap chưa được cấp phát cho một chương trình được chương trình sử dụng để cấp phát động trong quá trình thực thi chương trình. Mọi chương trình đều được cung cấp một nhóm bộ nhớ heap chưa được cấp phát mà nó có thể sử dụng trong quá trình thực thi. Nhóm bộ nhớ khả dụng này được gọi là bộ nhớ miễn phí của chương trình. Bộ nhớ lưu trữ miễn phí được cấp phát không được đặt tên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.