2011-08-19 13 views
11

Tại sao các ngôn ngữ lắp ráp lại sử dụng cả chồng và đống? Họ có vẻ dư thừa.Tại sao có một chồng và một đống?

+6

trong khi đó là câu hỏi hay, nó đã được trả lời [ở đây] (http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – Lars

+0

... và một câu hỏi tương tự, tập trung vào Windows, đã được trả lời [ở đây] (http://stackoverflow.com/questions/2422252/windows-assembly-heap-and-stack) (vì khác là hệ điều hành cụ thể tôi không bỏ phiếu để đóng , nhưng đó là một cuộc gọi gần). – eran

Trả lời

12

Chúng không thừa. Mỗi người trong số họ có điểm mạnh và điểm yếu: Một ngăn xếp là nhanh hơn nếu được sử dụng đúng, bởi vì phân bổ bộ nhớ là tầm thường (push/pop). Nhược điểm là bạn chỉ có thể thêm và xóa các mục ở trên cùng (do đó tên, ngăn xếp). Ngoài ra, tổng không gian ngăn xếp bị giới hạn, và khi bạn hết, bạn có một ... tràn, ngăn xếp ngăn xếp. Ngược lại, phân vùng này cho phép phân bổ ngẫu nhiên và phân bổ, và bạn có thể lưu trữ một lượng lớn dữ liệu ở đó, nhưng nhược điểm là phân bổ mang nhiều chi phí hơn - cho mỗi khối bộ nhớ được phân bổ, một phần miễn phí thích hợp phải được tìm thấy, và trong dài hạn, phân mảnh của không gian trống cần phải tránh, và hệ thống phải theo dõi nơi các khối miễn phí được.

Bạn sử dụng ngăn xếp để truyền các giá trị ngắn ngủi ngắn, ví dụ: biến truy cập cục bộ, đối số hàm, giá trị trả về, v.v. những chính họ cho vay theo phong cách phân bổ/pop. Đối với các cấu trúc dữ liệu lớn hơn hoặc lâu hơn, bạn sử dụng heap.

2

Đó là về xử lý và quản lý bộ nhớ. Có nhiều loại thanh ghi khác nhau của kiến ​​trúc x86. Có khả năng quản lý bộ nhớ được hỗ trợ phần cứng trên kiến ​​trúc x86 và vân vân.

Ngăn xếp được sử dụng bởi con trỏ lệnh, Heap dành cho phân đoạn dữ liệu trong một số ứng dụng.

Để đọc tôi lời khuyên Bạn càng đọc các liên kết sau đây:

"Một mô hình bộ nhớ cho phép một trình biên dịch để thực hiện nhiều quan trọng tối ưu" - Wikipedia

3

Bạn chắc chắn có thể xây dựng một hệ thống tính toán sử dụng một trong hai mô hình đó làm mô hình bộ nhớ duy nhất của nó. Tuy nhiên, cả hai đều có những đặc tính khá khác nhau với những điểm tốt và xấu. Hầu hết các hệ thống đều sử dụng cả hai để thu được lợi ích từ mỗi hệ thống.

Stacks

Một ngăn xếp có thể được coi như một đống đĩa, bạn viết một giá trị trên một tấm và đặt nó trên đỉnh của ngăn xếp này được gọi là hoạt động thúc đẩy và lưu trữ một giá trị trên ngăn xếp. Bạn rõ ràng có thể loại bỏ các tấm trên cùng từ ngăn xếp này được gọi là một hoạt động pop. Nhưng phân bổ mới phải luôn ở trên cùng của ngăn xếp.

Ngăn xếp có xu hướng được sử dụng cho các biến cục bộ và truyền các giá trị giữa các hàm. Nói chung ngăn xếp có tính chất tuyệt vời sau đây:

  • Yêu cầu chỉ có một số ít các con trỏ để quản lý
  • Rất dễ thực hiện trong phần cứng, hầu hết các bộ vi xử lý đã được xây dựng trong hỗ trợ phần cứng cho một chồng làm cho nó thậm chí còn nhanh hơn.
  • Rất nhanh chóng để cấp phát bộ nhớ

Vấn đề với chồng xuất phát từ các mục thực tế chỉ có thể được thêm vào/gỡ bỏ từ phía trên cùng của ngăn xếp. Bây giờ điều này có ý nghĩa lớn khi duyệt qua và xuống thông qua các cuộc gọi hàm: các hàm pop nhập vào từ ngăn xếp, phân bổ không gian cho các biến cục bộ trên ngăn xếp, hàm chạy, xóa các biến cục bộ từ phía trên cùng của chồng và đẩy giá trị trả về vào ngăn xếp . Nếu mặt khác, tôi muốn cấp phát một số bộ nhớ và nói chuyển nó đến một chủ đề khác hoặc nói chung miễn phí nó xa nơi mà nó được phân bổ đột ngột tôi gặp vấn đề, ngăn xếp không đúng vị trí khi tôi muốn để giải phóng bộ nhớ.

Bạn có thể nói ngăn xếp tạo điều kiện phân bổ bộ nhớ tuần tự nhanh.

Heap

Bây giờ heap là khác nhau mỗi phân bổ thường được theo dõi riêng lẻ. Điều này gây ra rất nhiều chi phí cho phân bổ và deallocations, nhưng mỗi người có thể được xử lý độc lập với phân bổ bộ nhớ khác, tốt cho đến khi bạn hết bộ nhớ.

Có rất nhiều thuật toán để đạt được điều này và nó có lẽ là một chút khôn ngoan khi twitter trên về họ ở đây nhưng đây là một liên kết mà nói về một vài tốt đơn giản thuật toán phân bổ đống: Alternatives to malloc and new

Vì vậy, các đống tạo điều kiện ngẫu nhiên phân bổ bộ nhớ nhưng điều này đi kèm với một hình phạt thời gian chạy, tuy nhiên hình phạt đó thường là nhỏ mà những gì sẽ được phát sinh nếu bạn đã phải xử lý tình hình bằng cách sử dụng chỉ là ngăn xếp.