01/10/2018, 00:28

So sánh cấp phát bộ nhớ động và tĩnh

Xin chào mọi người! Em tìm hiểu về việc cấp phát bộ nhớ thì gặp 2 khái niệm là cấp phát động và tĩnh. Đọc sách và tìm hiểu trên mạng em vẫn thấy mơ hồ, nên em xin hỏi mọi người về việc cấp phát động và cấp phát tĩnh thì hoạt động như thế nào và so sánh các ưu nhược điểm của 2 cách cấp phát bộ nhớ này ạ. Em rất mong được mọi người khai sáng cho em. Em xin cảm ơn!

cdxf viết 02:35 ngày 01/10/2018

Bộ nhớ tĩnh: Số lượng mảnh là xác định và không thay đổi (compile time). Ví dụ mảng bàn cờ vua (8x8), mảng ký tự tối đa(200 ký tự), mảng các ngày trong tuần …
Bộ nhớ động: Số lượng mảnh chỉ biết khi đang chạy (runtime time).
Ví dụ mảng n số nguyên, mảng n ký tự

Nguyễn Văn Hùng viết 02:34 ngày 01/10/2018

Cảm ơn anh! Nhưng cho em hỏi thêm là 2 kiểu cấp phát này thì ưu nhược điểm của nó ntn ạ?

Người bí ẩn viết 02:30 ngày 01/10/2018

Cấp phát tĩnh thì có thể sẽ thừa bộ nhớ do dùng không hết.
Cấp phát động thì khá hoàn thiện, nhưng phải biết chứa số lượng ô nhớ cần được tạo và các ô nhớ đều nằm cạnh nhau.

Cao hơn, bạn sẽ được làm quen với vector. Vector có thể nói là sự kết hợp giữa mảng tĩnh và mảng động và còn hơn thế nữa

Nguyễn Văn Hùng viết 02:36 ngày 01/10/2018

Thế về vấn đề phân mảnh bộ nhớ thì 2 cách cấp phát này như thế nào ạ?

Nguyễn Văn Tâm viết 02:31 ngày 01/10/2018

theo thuật toán LAFO nên cứ thế là đẩy vào thôi

LIFO-Last In First Out chứ bạn.

Nguyễn Văn Tâm viết 02:40 ngày 01/10/2018

Ở mức độ trừu tượng cao thì có vẻ không liên quan tới phân mảnh bộ nhớ lắm. Khi chương trình chạy sẽ được OS cấp phát cho một vùng nhớ logic duy nhất gọi là bộ nhớ ảo, tuy nhiên trên bộ nhớ vật lý có thể không liền mạch. Cái này do OS quản lý rồi nên lập trình viên không cần quan tâm, chỉ cần làm việc với bộ nhớ ảo thôi. Bộ nhớ ảo của chương trình chia làm các phần: Stack, Heap, Uninitialized data (BSS), Initialized data, code. Với biến tĩnh (cấp phát lúc compile) thì các biến global, static không được khởi tạo được cấp phát trong BSS, còn được khởi tạo thì cấp phát trong Initialized data. Các biến local sẽ được cấp phát trong Stack. Với biến cấp phát động (new, malloc…) sẽ được cấp phát trong Heap ở thời điểm chạy (Run-time). Vấn đề phân mảnh hay không là ở mức thấp hơn, OS sẽ lo. Đây là ý kiến của mình, nếu sai mong mọi người đừng ném đá

Bài liên quan
0