Các nội dung chính
- Bộ nhớ được cấp phát tĩnh được cấp phát vào thời gian biên dịch, trong khi bộ nhớ được cấp phát động được cấp phát vào thời gian chạy. Điều này làm cho việc phân bổ tĩnh nhanh hơn nhưng kém linh hoạt hơn.
- Bộ nhớ để phân bổ tĩnh đến từ phân đoạn ngăn xếp, trong khi phân bổ động sử dụng phân đoạn heap. Ngăn xếp có giới hạn kích thước nhưng truy cập nhanh hơn.
- Bộ nhớ được cấp phát tĩnh có kích thước cố định, được xác định trước, cấp phát động có thể cấp phát/giải phóng theo nhu cầu của chương trình trong quá trình thực thi.
Phân bổ bộ nhớ tĩnh trong C là gì?
Cấp phát bộ nhớ tĩnh trong C đề cập đến việc cấp phát bộ nhớ cho các biến hoặc cấu trúc dữ liệu trong giai đoạn biên dịch, trước khi chương trình được thực thi. Bộ nhớ được phân bổ bằng cách sử dụng phân bổ tĩnh vẫn cố định trong suốt quá trình thực thi chương trình và được xác định tại thời điểm biên dịch. Điều này trái ngược với việc phân bổ bộ nhớ động, trong đó bộ nhớ được phân bổ trong thời gian chạy bằng cách sử dụng các hàm như malloc() và có thể thay đổi kích thước hoặc phân bổ lại khi cần.
Việc cấp phát bộ nhớ tĩnh có ưu điểm là hiệu quả vì bộ nhớ được cấp phát và quản lý bởi chính trình biên dịch. Tuy nhiên, nó có những hạn chế, chẳng hạn như không thể thay đổi kích thước bộ nhớ trong thời gian chạy và có thể gây lãng phí bộ nhớ nếu không gian được phân bổ không được sử dụng hết. Việc cấp phát bộ nhớ tĩnh cũng có thể dẫn đến các vấn đề như tràn bộ đệm nếu không được sử dụng cẩn thận.
Phân bổ bộ nhớ động trong C là gì?
Cấp phát bộ nhớ động trong C đề cập đến việc cấp phát và giải phóng bộ nhớ cho các biến và cấu trúc dữ liệu trong thời gian chạy chương trình. Không giống như cấp phát bộ nhớ tĩnh, trong đó bộ nhớ được cấp phát tại thời điểm biên dịch và vẫn cố định, cấp phát bộ nhớ động cho phép bạn yêu cầu bộ nhớ từ hệ điều hành khi cần và giải phóng bộ nhớ khi không còn cần thiết. Điều này mang lại sự linh hoạt cao hơn trong việc quản lý tài nguyên bộ nhớ và rất cần thiết để tạo cấu trúc dữ liệu có kích thước được xác định khi chạy.
Cấp phát bộ nhớ động rất hữu ích khi bạn không biết kích thước bộ nhớ cần thiết tại thời điểm biên dịch hoặc khi yêu cầu bộ nhớ có thể thay đổi trong quá trình thực hiện chương trình. Các trường hợp sử dụng phổ biến bao gồm tạo mảng động, danh sách liên kết, cây và các cấu trúc dữ liệu khác có thể tăng hoặc thu nhỏ khi cần.
Sự khác biệt giữa phân bổ bộ nhớ tĩnh và động trong C
- Bộ nhớ tĩnh được cấp phát trong thời gian biên dịch trước khi chương trình bắt đầu chạy. Bộ nhớ động được cấp phát trong thời gian chạy, trong khi chương trình đang thực thi.
- Kích thước bộ nhớ tĩnh được xác định tại thời điểm biên dịch và được giữ cố định trong suốt quá trình thực thi chương trình. Kích thước bộ nhớ động có thể được xác định trong thời gian chạy và thay đổi trong quá trình thực thi chương trình.
- Tĩnh kém linh hoạt hơn vì việc phân bổ bộ nhớ là cố định và không thể thay đổi trong thời gian chạy. Động linh hoạt hơn vì bộ nhớ có thể được phân bổ, thay đổi kích thước và giải phóng khi cần.
- Các biến tĩnh được phân bổ tĩnh và có thời gian tồn tại kéo dài trong toàn bộ quá trình thực hiện chương trình. Bộ nhớ động được cấp phát động và chỉ tồn tại khi chương trình giữ tham chiếu đến nó; nó có thể được phát hành bằng cách sử dụng free().
- Trình biên dịch quản lý tĩnh; lập trình viên không yêu cầu quản lý bộ nhớ rõ ràng. Động yêu cầu phân bổ và phân bổ bộ nhớ rõ ràng bằng cách sử dụng các hàm như malloc(), calloc(), realloc() và free().
So sánh giữa phân bổ bộ nhớ tĩnh và động trong C
Các thông số so sánh | Phân bổ bộ nhớ tĩnh | Phân bổ bộ nhớ động |
---|---|---|
Khởi tạo | Các biến được khởi tạo về giá trị mặc định (không cho biến toàn cục và biến tĩnh). | Bộ nhớ được cấp phát động chứa các giá trị không xác định; cần khởi tạo rõ ràng. |
Vị trí bộ nhớ | Bộ nhớ được phân bổ trong phân đoạn dữ liệu của chương trình. | Bộ nhớ được phân bổ trong đoạn heap của không gian bộ nhớ của chương trình. |
Kích thước mảng | Kích thước mảng phải được biết tại thời điểm biên dịch; kích thước cố định. | Mảng có thể được thay đổi kích thước một cách linh hoạt bằng cách sử dụng realloc(). |
Trên không | Ít chi phí hơn vì bộ nhớ được phân bổ một lần trong quá trình khởi động chương trình. | Nhiều chi phí hơn do phân bổ thời gian chạy và khả năng phân mảnh bộ nhớ. |
Phạm vi và quyền truy cập | Các biến có thể truy cập được trong phạm vi tương ứng của chúng. | Bộ nhớ được cấp phát động có thể được truyền qua các hàm, làm tăng phạm vi của nó. |
- https://ieeexplore.ieee.org/abstract/document/6807799/
- https://inria.hal.science/hal-02456533/document