Ngăn xếp: Ngăn xếp được sử dụng như một ngăn tạm thời để sử dụng bởi khối mã hiện đang thực thi và bất kỳ khối nào được gọi là mã hiện tại và bất kỳ khối nào được gọi là khối đó, v.v. Khi khối hiện tại thoát, các biến cục bộ mà nó đang sử dụng bị lãng quên. Như tên cho biết, ngăn xếp được sử dụng theo cách cuối cùng, đầu tiên.
Một trong những cách sử dụng quan trọng nhất của ngăn xếp là theo dõi chuỗi cuộc gọi hiện tại. Khi một hàm gọi một hàm khác, người gọi sẽ đẩy địa chỉ của lệnh tiếp theo (địa chỉ trả về) vào ngăn xếp. Khi mỗi hàm thoát, nó bật địa chỉ trả về của người gọi ra khỏi ngăn xếp và tiếp tục thực thi mã bắt đầu từ địa chỉ đó. Nó cũng được sử dụng để truyền thông số hàm và trả về giá trị giữa người gọi và callee.
Heap: Heap là khác nhau - không có thứ tự cụ thể cho nó. Nếu bạn muốn cấp phát bộ nhớ trong một khối mã và có thẻ nhớ đó nằm ngoài phần cuối của khối, bạn phân bổ bộ nhớ đó trên heap. Tất nhiên, bạn cũng sẽ cần phải lưu trữ một con trỏ/tham chiếu đến nó ở đâu đó để mã khác có thể tìm thấy bộ nhớ đó; hầu hết các ngôn ngữ cung cấp chỗ ở đó.
Tốc độ: Sự khác biệt về tốc độ không phải do bất kỳ thuộc tính nào của bộ nhớ - như bạn nói trong câu hỏi, cả chồng và đống thường nằm trong cùng một bộ nhớ vật lý. Phân bổ không gian trên ngăn xếp là nhanh chóng do các ngăn xếp LIFO bản chất: nếu bạn đẩy một cái gì đó vào ngăn xếp, chỉ có một nơi nó có thể kết thúc. Ngược lại, việc phân bổ một khối trên heap đòi hỏi phải tìm một khu vực tự do tiếp giáp đủ lớn trong bộ nhớ. Sự phân bổ stack có thể nhanh như một lệnh đơn; phân bổ đống yêu cầu cuộc gọi đến chức năng cấp phát bộ nhớ như malloc()
.
Tĩnh động: Phân bổ bộ nhớ trên heap là động - cho dù phân bổ một khối và kích thước của khối có thể được xác định theo đầu vào chương trình nhận được trong khi nó đang chạy. Các vùng bộ nhớ được phân bổ trên heap thậm chí có thể được thay đổi kích thước nếu cần thiết. Có thể cũng có thể để cấp phát bộ nhớ động trên ngăn xếp (xem hàm thư viện chuẩn C alloca()
), nhưng bộ nhớ đó sẽ bị mất ngay khi chức năng hiện tại thoát. Stack phân bổ thường là tĩnh - trình biên dịch xác định bao nhiêu không gian là cần thiết cho các tham số (không đăng ký), trả về dữ liệu, và biến cục bộ, và nó tạo mã để dự trữ không gian cần thiết trên stack khi hàm được gọi.
Ví dụ: Hãy tưởng tượng bạn đang tạo bộ xử lý văn bản. Bạn không thể biết trước tài liệu sẽ lớn như thế nào, hoặc thậm chí bao nhiêu tài liệu sẽ được sử dụng cùng một lúc. Đồng thời, bạn muốn tài liệu của người dùng vẫn còn trong bộ nhớ miễn là người dùng muốn giữ chúng ở trạng thái mở. Nếu bạn cố gắng cấp phát bộ nhớ cho các tài liệu trên ngăn xếp, bạn sẽ thấy khó mở nhiều lần cùng một lúc và bạn sẽ cần phải tạo một hàm duy nhất để tạo, chỉnh sửa, lưu và đóng tài liệu. Phân bổ không gian trên heap cho phép bạn tạo bao nhiêu tài liệu theo ý muốn, mỗi tài liệu có kích thước phù hợp với dữ liệu chứa, và tránh buộc thời gian tồn tại của tài liệu vào tuổi thọ của bất kỳ chức năng cụ thể nào.
Tóm tắt: Tóm lại, ngăn xếp giữ giá trị của biến (đôi khi đăng ký được sử dụng để thay thế), trong khi vùng được sử dụng để phân bổ bộ nhớ sẽ được sử dụng vượt quá tuổi thọ của khối hiện tại.
http://stackoverflow.com/questions/7123936/why-is-there-a-stack-and-a-heap – drdwilcox
http://stackoverflow.com/questions/79923/what-and-where-are -the-stack-and-heap –