Bộ nhớ của một chương trình C/C++ có thể được cấp phát trong Heap hoặc Stack. Xem lại bài viết Bố cục bộ nhớ của một chương trình C để biết thêm chi tiết về cách các biến được lưu trữ trong bộ nhớ như thế nào nhé.
Cấp phát bộ nhớ trên Stack
Việc cấp phát bộ nhớ xảy trên các khối bộ nhớ liền kề. Chúng ta gọi nó là cấp phát ngăn xếp vì nó có liên quan đến ngăn xếp của các lời gọi hàm. Kích thước cần cấp phát được biết bởi trình biên dịch. Bất cứ khi nào một hàm được gọi, các biến của nó sẽ được cấp vào stack. Và bất cứ khi nào việc gọi hàm kết thúc, các biến của nó sẽ được giải phóng. Quá trình này được thực hiện bởi tập các tác vụ được định nghĩa trước trong trình biên dịch. Người dùng không cần phải quá lo lắng về việc cập phát bộ nhớ trên stack.
int main()
{
// Tất cả các biến sau sẽ được cấp phát vào stack.
int a;
int b[10];
int n = 20;
int c[n];
}
Cấp phát bộ nhớ trên Heap
Bộ nhớ được phân cấp trong khi thực hiện các lệnh được viết bởi người dùng. Lưu ý rằng tên heap ở đây không liên quan gì đến cấu trúc dữ liệu heap. Nó được gọi là heap vì nó là một đống không gian bộ nhớ có sẵn để người đùng có thể phân bổ đi phân bổ lại theo mục đích sử dụng. Nếu không xử lý tốt bộ nhớ này, rò rỉ bộ nhớ (memory leak) có thể xảy ra trong chương trình.
int main()
{
// Vùng nhớ cho 10 số nguyên sẽ được cấp trong heap.
int *ptr = new int[10];
}
Sự khác biệt giữa việc cấp phát bộ nhớ trong heap và stack
- Trong stack, việc cấp phát và giải phóng bộ nhớ được thực hiện tự động, trong khi đó, heap cần phải được thực hiện thủ công bởi người lập trình.
- Xử lý khung heap tốn kém hơn xử lý khung stack.
- Vấn đề thiếu bộ nhớ có nhiều khả năng xảy ra trong stack, trong khi vấn đề chính trong bộ nhớ heap là sự phân mảnh.
- Truy cập khung stack dễ dàng hơn khung heap vì stack có vùng nhớ nhỏ và thân thiện với bộ đệm, nhưng trong trường hợp khung heap bị phân tán trong bộ nhớ nên sẽ gây ra nhiều lỗi cache hơn.
- Stack không linh hoạt, kích thước bộ nhớ được cấp phát không thể thay đổi trong khi heap là linh hoạt và bộ nhớ được cấp phát có thể thay đổi được.
- Thời gian truy cập của heap mất nhiều hơn stack.
Bảng so sánh giữa cấp phát bộ nhớ trong stack và trong heap:
Khía cạnh | STACK | HEAP |
---|---|---|
Cơ bản | Bộ nhớ được cập phát trong một khối liên tục | Bộ nhớ được cấp phát theo thứ tự ngẫu nhiên |
Cấp phát và giải phóng | Tự động bởi trình biên dịch | Thủ công bởi người lập trình |
Chi phí | Thấp | Cao |
Hiện thực | Khó | Dễ |
Thời gian truy xuất | Nhanh | Chậm |
Vấn đề gặp phải | Thiếu bộ nhớ | Phân mảnh bộ nhớ |
Tính linh động | Kích thước cấp phát cố định | Kích thước sau cấp phát có thể thay đổi được |
Cấu trúc dữ liệu | Tuyến tính | Có Phân cấp |
Để lại một bình luận