2014-12-12 22 views
11

Tôi muốn undesrtand và những gì được lưu trữ trong stack/heap trong swift. Tất cả mọi thứ mà bạn in và địa chỉ bộ nhớ sẽ không xuất hiện, các giá trị được lưu trữ trong ngăn xếp, và những gì được in ra dưới dạng giá trị, những giá trị đó nằm trên heap, về cơ bản theo giá trị và kiểu tham chiếu. Tôi hoàn toàn sai? Và tùy chọn, bạn có thể cung cấp một bản trình bày trực quan của stack/heap không?Hiểu biết ngăn xếp/heap nhanh chóng

+0

Bản trình bày này giải thích một số cách sử dụng và ngăn xếp của Swift: https://realm.io/news/andy-matuschak-controlling-complexity/. Tóm lại, bạn không thể đưa ra giả định cho dù giá trị hoặc tham chiếu sẽ kết thúc trên heap hay stack, giống như bạn có thể trong C. –

+0

Ngạc nhiên là chưa ai trả lời câu hỏi này, đây là loại ngôn ngữ bí mật chỉ được biết sau bạn trả một cái gì đó để táo ?? – Ahmed

Trả lời

7

Các lớp (loại tham chiếu) được cấp phát trong heap, các loại giá trị (như Struct, String, Int, Bool, v.v.) nằm trong ngăn xếp. Xem chủ đề này cho câu trả lời chi tiết hơn: Why Choose Struct Over Class?

13

như Juul tuyên bố loại tham chiếu được lưu trữ trong Heap và giá trị trong ngăn xếp ...

Ở đây tôi muốn cung cấp cho các giải thích lý do tại sao ...

Stack và một Heap?

Ngăn xếp được sử dụng để phân bổ bộ nhớ tĩnh và Heap cho phân bổ bộ nhớ động, cả hai được lưu trữ trong RAM của máy tính.

Các biến được phân bổ trên ngăn xếp được lưu trực tiếp vào bộ nhớ và quyền truy cập vào bộ nhớ này rất nhanh và phân bổ của nó được xử lý khi chương trình được biên dịch. Khi một hàm hoặc một phương thức gọi một hàm khác mà lần lượt gọi một hàm khác, vv, việc thực hiện tất cả các hàm đó vẫn bị treo cho đến khi hàm cuối cùng trả về giá trị của nó. Ngăn xếp luôn được đặt trước theo thứ tự LIFO, khối được đặt trước gần đây nhất luôn là khối tiếp theo được giải phóng. Điều này làm cho nó thực sự đơn giản để theo dõi các ngăn xếp, giải phóng một khối từ ngăn xếp là gì hơn là điều chỉnh một con trỏ.

enter image description here

biến cấp phát trên heap có bộ nhớ của họ được phân bổ vào thời gian chạy và truy cập vào bộ nhớ này là chậm hơn một chút, nhưng kích thước đống chỉ bị giới hạn bởi kích thước của bộ nhớ ảo. Yếu tố của đống không có sự phụ thuộc với nhau và luôn luôn có thể được truy cập ngẫu nhiên bất cứ lúc nào. Bạn có thể phân bổ một khối bất cứ lúc nào và giải phóng nó bất cứ lúc nào. Điều này làm cho nó phức tạp hơn nhiều để theo dõi những phần nào của vùng được phân bổ hoặc miễn phí tại bất kỳ thời điểm nào.

Các vấn đề liên quan