Cấp phát bộ nhớ trong C++
Cấp phát bộ nhớ trong C++
Ngôn ngữ C++ hỗ trợ ba loại cấp phát bộ nhớ cơ bản, hai loại trong số đó bạn đã được học ở những bài học trước:
- Cấp phát bộ nhớ tĩnh (Static memory allocation):
- Xảy ra trên các biến tĩnh và biến toàn cục.
- Vùng nhớ của các loại biến này được cấp phát một lần khi chương trình bắt đầu chạy và vẫn tồn tại trong suốt thời gian tồn tại của chương trình.
- Kích thước của biến/mảng phải được biết tại thời điểm biên dịch chương trình.
- Cấp phát bộ nhớ tự động (Automatic memory allocation):
- Xảy ra trên các tham số hàm và biến cục bộ.
- Vùng nhớ của các loại biến này được cấp phát khi chương trình đi vào khối lệnh và được giải phóng khi khối lệnh bị thoát.
- Kích thước của biến/mảng phải được biết tại thời điểm biên dịch chương trình.
- Cấp phát bộ nhớ động (Dynamic memory allocation) sẽ được nói đến trong bài học này.
Trong hầu hết các trường hợp, cấp phát bộ nhớ tĩnh và tự động có thể đáp ứng tốt các yêu cầu của chương trình. Tuy nhiên, ta cùng xem ví dụ bên dưới:
Ví dụ: Chúng ta cần sử dụng một chuỗi để lưu tên của người dùng, nhưng chúng ta không biết tên của họ dài bao nhiêu cho đến khi họ nhập tên. Hoặc chúng ta cần lưu trữ danh sách nhân viên trong một công ty, nhưng chúng ta không biết trước được công ty đó sẽ có bao nhiêu nhân viên.
Đối với cấp phát bộ nhớ tĩnh và tự động, kích thước của biến/mảng phải được biết tại thời điểm biên dịch chương trình. Vì vậy, điều tốt nhất chúng ta có thể làm là cố gắng đoán một kích thước tối đa của các biến đó:
char name[30]; // tên không quá 30 ký tự
Staff staff[500]; // công ty không quá 500 nhân viên
123
Khuyết điểm của cách khai báo trên:
- Gây lãng phí bộ nhớ nếu các biến không thực sự sử dụng hết kích thước khi khai báo. Ví dụ: nếu công ty chỉ có 100 nhân viên, chúng ta có 400 vùng nhớ nhân viên không được sử dụng tới.
- Thứ hai, hầu hết các biến thông thường (bao gồm mảng tĩnh) được cấp phát trong một phần bộ nhớ gọi là ngăn xếp (stack). Kích thước bộ nhớ stack cho một chương trình khá nhỏ (khoảng 1Mb với Visual Studio), nếu yêu cầu cấp phát vùng nhớ vượt quá con số này, chương trình sẽ bị đóng bởi hệ điều hành với lỗi stack overflow.
char byte[1000000 * 2]; // khoảng 2Mb bộ nhớ => lỗi stack overflow
1
- Thứ ba, điều gì xảy ra nếu công ty có 600 nhân viên, trong khi mảng staff chỉ có 500 phần tử. Lúc này, chương trình sẽ bị giới hạn bởi kích thước được khai báo ban đầu.
Để giải quyết những hạn chế trên, cấp phát bộ nhớ động được ra đời.
Không có nhận xét nào: