Stack vs Heap: Biết sự khác biệt

Mục lục:

Anonim

Ngăn xếp là gì?

Ngăn xếp là một vùng đặc biệt của bộ nhớ máy tính, nơi lưu trữ các biến tạm thời được tạo bởi một hàm. Trong ngăn xếp, các biến được khai báo, lưu trữ và khởi tạo trong thời gian chạy.

Nó là một bộ nhớ lưu trữ tạm thời. Khi tác vụ tính toán hoàn tất, bộ nhớ của biến sẽ tự động bị xóa. Phần ngăn xếp chủ yếu chứa các phương thức, biến cục bộ và các biến tham chiếu.

Trong hướng dẫn này, bạn sẽ học,

  • Stack là gì?
  • Heap là gì?
  • Sự khác biệt chính giữa Stack và Heap
  • Ưu điểm của việc sử dụng Stack
  • Ưu điểm của việc sử dụng Heap
  • Nhược điểm của việc sử dụng Stack
  • Nhược điểm của việc sử dụng Heap
  • Khi nào sử dụng Heap hoặc ngăn xếp?

Heap là gì?

Heap là một bộ nhớ được sử dụng bởi các ngôn ngữ lập trình để lưu trữ các biến toàn cục. Theo mặc định, tất cả các biến toàn cục được lưu trữ trong không gian bộ nhớ heap. Nó hỗ trợ cấp phát bộ nhớ động.

Heap không được quản lý tự động cho bạn và không được quản lý chặt chẽ bởi CPU. Nó giống như một vùng ký ức trôi nổi tự do hơn.

SỰ KHÁC BIỆT CHÍNH

  • Stack là một cấu trúc dữ liệu tuyến tính trong khi Heap là một cấu trúc dữ liệu phân cấp.
  • Bộ nhớ ngăn xếp sẽ không bao giờ bị phân mảnh trong khi bộ nhớ Heap có thể bị phân mảnh khi các khối bộ nhớ được cấp phát đầu tiên và sau đó được giải phóng.
  • Stack chỉ truy cập các biến cục bộ trong khi Heap cho phép bạn truy cập các biến trên toàn cầu.
  • Các biến ngăn xếp không thể được thay đổi kích thước trong khi các biến Heap có thể được thay đổi kích thước.
  • Bộ nhớ ngăn xếp được cấp phát trong một khối liền kề trong khi bộ nhớ Heap được cấp phát theo bất kỳ thứ tự ngẫu nhiên nào.
  • Stack không yêu cầu khử cấp phát các biến trong khi trong Heap thì cần khử cấp phát.
  • Phân bổ ngăn xếp và phân bổ giao dịch được thực hiện bởi các hướng dẫn của trình biên dịch trong khi cấp phát Heap và phân bổ giao dịch được thực hiện bởi lập trình viên.

Sự khác biệt chính giữa Stack và Heap

Tham số Cây rơm Đống
Loại cấu trúc dữ liệu Ngăn xếp là một cấu trúc dữ liệu tuyến tính. Heap là một cấu trúc dữ liệu phân cấp.
Tốc độ truy cập Truy cập tốc độ cao Chậm hơn so với ngăn xếp
Quản lý không gian Không gian được quản lý hiệu quả bởi hệ điều hành để bộ nhớ sẽ không bao giờ bị phân mảnh. Heap Space không được sử dụng hiệu quả. Bộ nhớ có thể bị phân mảnh khi các khối bộ nhớ được cấp phát đầu tiên và sau đó được giải phóng.
Truy cập Chỉ các biến cục bộ Nó cho phép bạn truy cập các biến trên toàn cầu.
Giới hạn kích thước không gian Giới hạn về kích thước ngăn xếp phụ thuộc vào hệ điều hành. Không có giới hạn cụ thể về kích thước bộ nhớ.
Thay đổi kích thước Không thể thay đổi kích thước các biến Các biến có thể được thay đổi kích thước.
Cấp phát bộ nhớ Bộ nhớ được cấp phát trong một khối liền kề. Bộ nhớ được cấp phát theo bất kỳ thứ tự ngẫu nhiên nào.
Phân bổ và Giao dịch Thực hiện tự động bằng hướng dẫn của trình biên dịch. Nó được thực hiện thủ công bởi lập trình viên.
Sự phân bổ Không yêu cầu cấp phát biến. Phân bổ rõ ràng là cần thiết.
Giá cả Ít hơn Hơn
Thực hiện Một ngăn xếp có thể được triển khai theo 3 cách đơn giản dựa trên mảng, sử dụng bộ nhớ động và dựa trên danh sách được liên kết. Heap có thể được thực hiện bằng cách sử dụng mảng và cây.
Vấn đề chính Thiếu bộ nhớ Phân mảnh bộ nhớ
Vị trí tham chiếu Hướng dẫn thời gian biên dịch tự động. Đầy đủ
Uyển chuyển Kích thước cố định Có thể thay đổi kích thước
Thời gian truy cập Nhanh hơn Chậm hơn

Ưu điểm của việc sử dụng Stack

Dưới đây là những ưu / lợi ích của việc sử dụng ngăn xếp:

  • Giúp bạn quản lý dữ liệu theo phương pháp Last In First Out (LIFO) mà phương pháp này không thể thực hiện được với mảng và danh sách được liên kết.
  • Khi một hàm được gọi là các biến cục bộ được lưu trữ trong một ngăn xếp và nó sẽ tự động bị hủy sau khi được trả về.
  • Ngăn xếp được sử dụng khi một biến không được sử dụng bên ngoài hàm đó.
  • Nó cho phép bạn kiểm soát cách bộ nhớ được cấp phát và phân bổ.
  • Stack tự động dọn dẹp đối tượng.
  • Không dễ bị hỏng
  • Không thể thay đổi kích thước các biến.

Ưu điểm của việc sử dụng Heap

Ưu điểm / lợi ích của việc sử dụng bộ nhớ heap là:

  • Heap giúp bạn tìm số lớn nhất và nhỏ nhất
  • Bộ sưu tập rác chạy trên bộ nhớ heap để giải phóng bộ nhớ được sử dụng bởi đối tượng.
  • Phương thức Heap cũng được sử dụng trong Hàng đợi Ưu tiên.
  • Nó cho phép bạn truy cập các biến trên toàn cầu.
  • Heap không có bất kỳ giới hạn nào về kích thước bộ nhớ.

Nhược điểm của việc sử dụng Stack

Nhược điểm / Hạn chế của việc sử dụng bộ nhớ Stack là:

  • Bộ nhớ ngăn xếp rất hạn chế.
  • Tạo quá nhiều đối tượng trên ngăn xếp có thể làm tăng nguy cơ tràn ngăn xếp.
  • Truy cập ngẫu nhiên là không thể.
  • Bộ nhớ biến sẽ bị ghi đè, đôi khi dẫn đến hành vi không xác định của hàm hoặc chương trình.
  • Ngăn xếp sẽ nằm ngoài vùng bộ nhớ, điều này có thể dẫn đến kết thúc bất thường.

Nhược điểm của việc sử dụng Heap

Nhược điểm / hạn chế của việc sử dụng bộ nhớ Heaps là:

  • Nó có thể cung cấp bộ nhớ tối đa mà một hệ điều hành có thể cung cấp
  • Cần nhiều thời gian hơn để tính toán.
  • Quản lý bộ nhớ phức tạp hơn trong bộ nhớ heap vì nó được sử dụng trên toàn cầu.
  • Mất quá nhiều thời gian thực thi so với ngăn xếp.

Khi nào sử dụng Heap hoặc ngăn xếp?

Bạn nên sử dụng heap khi bạn yêu cầu cấp phát một khối bộ nhớ lớn. Ví dụ: bạn muốn tạo một mảng có kích thước lớn hoặc cấu trúc lớn để giữ biến đó trong một thời gian dài thì bạn nên phân bổ nó trên heap.

Tuy nhiên, nếu bạn đang làm việc với các biến tương đối nhỏ chỉ được yêu cầu cho đến khi hàm sử dụng chúng còn hoạt động. Sau đó, bạn cần sử dụng ngăn xếp, nhanh hơn và dễ dàng hơn.