Giới thiệu
Khi một chương trình được thực thi, nó sẽ được nạp vào trong bộ nhớ, vậy quá trình đó được thực hiện và tổ chức như thế nào?
Đối tượng hướng đến
Những lập trình viên đang nghiên cứu về các vùng nhớ hoặc bắt đầu làm quen với con trỏ
Kiến thức mở đầu
Khi ta khai báo một biến trong C++, thì biến này gồm 2 phần là địa chỉ và giá trị của nó. Không chỉ có biến, mà các đoạn mã nguồn cũng có địa chỉ chỉ và giá trị. Có bao giờ bạn thắc mắc rằng biến hay mã nguồn được lưu trữ như thế nào khi chương trình thực thi?
Khi chương trình được khởi chạy, hệ điều hành sẽ chọn ra 4 vùng nhớ trống trong RAM có kích thước tương ứng với kích thước của 4 vùng nhớ mà chương trình cần sử dụng, mà ta thường gọi là Memory Segment. Biến và mã nguồn sẽ được lưu trữ trong các Segment này, địa chỉ của chúng chính là địa chỉ trong RAM.
Các vùng nhớ
Code Segment
Mã nguồn của chúng ta sau khi hoàn tất quá trình Build sẽ chuyển thành các đoạn mã máy 0 và 1. Khi chương trình khởi chạy, các đoạn mã máy này sẽ được nạp vào Code Segment. Cách duy nhất để truy xuất vào vùng nhớ này là sử dụng Con trỏ hàm.
Code Segment có kích thước cố định.
Data Segment
Khi chương trình được khởi chạy, toàn bộ các biến toàn cục và static đều được lưu trữ ở đây, các đoạn chuỗi cố định cũng được lưu trữ trong Data Segment.
Data Segment có kích thước cố định
Stack Segment
Đây là vùng nhớ mà chúng ta cần quan tâm. Khi một hàm được gọi, hàm đó sẽ được đưa vào vùng nhớ Stack, các biến được khai báo trong hàm đó cũng được đưa vào vùng nhớ Stack. Khi hàm kết thúc, toàn bộ các biến trong hàm cùng với bản thân hàm sẽ được tự động giải phóng để các hàm sau sử dụng.
Stack Segment có kích thước cố định. Khi chúng ta khai báo quá nhiều biến hoặc một mảng có số lượng phần tử quá lớn, một hàm đệ quy vô hạn… bộ nhớ Stack sẽ bị đầy, dẫn đến chương trình bị dừng. Chúng ta cần lưu ý chuyện này.
Heap Segment
Đây là vùng nhớ khác mà chúng ta cần quan tâm, vùng nhớ này chúng ta phải hoàn toàn kiểm soát nó. Khi chúng ta sử dụng con trỏ và cấp phát động một vùng nhớ cho con trỏ quản lý, vùng nhớ này sẽ nằm trong Heap Segment. Những vùng nhớ được cấp phát động sẽ không tự động thu hồi khi khối lệnh kết thúc, lập trình viên phải chủ động thu hồi chúng khi không còn nhu cầu sử dụng.
Heap Segment có kích thước không cố định, nên nó còn được gọi là vùng nhớ động, kích thước của nó có thể tăng hoặc giảm tùy vào sự cấp phát động. Lưu ý là Heap có thể mở rộng cho đến khi RAM đầy, nên chúng ta cần kiểm soát thật tốt, thu hồi các vùng nhớ được cấp phát động ngay khi không còn nhu cầu sử dụng để tránh việc lãng phí bộ nhớ.
Lời kết
Đây là bài viết mở đầu của chương con trỏ, nên các kiến thức này khá quan trọng, đặc biệt là kiến thức về Stack và Heap. Các khái niệm mới được đề cập ở trên như con trỏ, con trỏ hàm, cấp phát động sẽ được giải thích rõ ở các bài viết tiếp theo.
source: http://www.stdio.vn/articles/read/151/to-chuc-bo-nho-chuong-trinh
0 comments :
Post a Comment