close up photo of programming of codes

codecungnhau.com

Một trang web về kỹ thuật lập trình

Cấp phát bộ nhớ Stack và Heap trong C/C++

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

  1. 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.
  2. Xử lý khung heap tốn kém hơn xử lý khung stack.
  3. 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.
  4. 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.
  5. 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.
  6. 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ạnhSTACKHEAP
Cơ bảnBộ nhớ được cập phát trong một khối liên tụcBộ nhớ được cấp phát theo thứ tự ngẫu nhiên
Cấp phát và giải phóngTự động bởi trình biên dịchThủ công bởi người lập trình
Chi phíThấpCao
Hiện thựcKhóDễ
Thời gian truy xuấtNhanhChậm
Vấn đề gặp phảiThiếu bộ nhớPhân mảnh bộ nhớ
Tính linh độngKích thước cấp phát cố địnhKích thước sau cấp phát có thể thay đổi được
Cấu trúc dữ liệuTuyến tínhCó Phân cấp


Đã đăng vào

trong

bởi

Thẻ:

Bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *