Thursday, November 3, 2016

Stack và Heap

1. Stack
- Cấp phát(allocate) vùng nhớ cho biến nhanh hơn trên heap.
- Các biến được khởi tạo trên stack sẽ tự hủy(deallocate) khi ra khỏi scope.
- Hoạt động theo nguyên tắc FILO(First In Last Out).
- Lưu trữ các biến local, địa chỉ trả về của hàm(return address) lúc hàm được thực thi, các tham số truyền vào hàm(parameter).
- Sử dụng quá nhiều sẽ bị tràn stack(stack overflow), thường do đệ quy, vòng lặp vô tận, hoặc dữ liệu có kích thước lớn.
- Dữ liệu trên stack có thể sử dụng trực tiếp không thông qua con trỏ(pointer).
- Thường được cấp phát kích thước tối đa khi chương trình bắt đầu chạy.
- Sử dụng stack phải biết chính xác kích thước vùng nhớ cần cấp phát lúc runtime.
- Trong các chương trình multi-thread, mỗi child-thread sinh ra sẽ có stack riêng.

2. Heap
- Cấp phát(allocate) vùng nhớ chậm hơn stack.
- Chứa dữ liệu được cấp phát bằng cách gọi hàm new, allocate. Không tự hủy(deallocate) khi ra khỏi scope, phải hủy bằng hàm delete hoặc free.
- Có thể không cấp phát được nếu chương trình yêu cầu cấp phát vùng nhớ quá lớn và heap không đủ vùng nhớ để cấp phát.
- Vùng nhớ heap bị phân mảnh(fragmentation) khi cấp phát và hủy nhiều lần.
- Có thể truy cập dữ liệu thông qua con trỏ(pointer).
- Có thể bị leak memory.
- Sử dụng heap có thể cấp phát động kích thước lúc run-time mà không cần biết trước.