Hầu hết các triển khai chức năng cấp phát bộ nhớ C sẽ lưu trữ thông tin kế toán cho từng khối, theo dòng hoặc riêng biệt.
Một cách điển hình (nội tuyến) là thực sự phân bổ cả tiêu đề và bộ nhớ bạn yêu cầu, được đệm ra một số kích thước tối thiểu. Vì vậy, ví dụ, nếu bạn yêu cầu 20 byte, hệ thống có thể phân bổ một khối 48 byte:
- Tiêu đề 16 byte chứa kích thước, điểm đánh dấu đặc biệt, tổng kiểm tra, con trỏ tới khối tiếp theo / trước, v.v.
- Vùng dữ liệu 32 byte (20 byte của bạn được đệm thành bội số của 16).
Địa chỉ được cung cấp cho bạn là địa chỉ của vùng dữ liệu. Sau đó, khi bạn giải phóng khối, free
chỉ cần lấy địa chỉ bạn cung cấp và giả sử bạn chưa nhồi địa chỉ đó hoặc bộ nhớ xung quanh nó, hãy kiểm tra thông tin kế toán ngay trước nó. Về mặt đồ họa, đó sẽ là dọc theo dòng:
____ The allocated block ____
/ \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
^
|
+-- The address you are given
Hãy ghi nhớ kích thước của tiêu đề và phần đệm hoàn toàn được xác định thực hiện (thực ra, toàn bộ điều được xác định theo thực hiện (a) nhưng tùy chọn kế toán nội tuyến là một tùy chọn phổ biến).
Tổng kiểm tra và các điểm đánh dấu đặc biệt tồn tại trong thông tin kế toán thường là nguyên nhân gây ra các lỗi như "Đấu trường bộ nhớ bị hỏng" hoặc "Nhân đôi miễn phí" nếu bạn ghi đè lên chúng hoặc giải phóng chúng hai lần.
Phần đệm (để phân bổ hiệu quả hơn) là lý do tại sao đôi khi bạn có thể viết một chút ngoài phần cuối của không gian bạn yêu cầu mà không gây ra sự cố (vẫn không làm điều đó, đó là hành vi không xác định và đôi khi nó hoạt động, không ' t có nghĩa là nó ổn để làm điều đó).
(a) Tôi đã viết các triển khai malloc
trong các hệ thống nhúng, nơi bạn có 128 byte cho dù bạn yêu cầu gì (đó là kích thước của cấu trúc lớn nhất trong hệ thống), giả sử bạn đã yêu cầu 128 byte hoặc ít hơn (yêu cầu nhiều hơn sẽ được đáp ứng với giá trị trả về NULL). Một mặt nạ bit rất đơn giản (nghĩa là không phải trong dòng) đã được sử dụng để quyết định xem một đoạn 128 byte có được phân bổ hay không.
Những người khác mà tôi đã phát triển có các nhóm khác nhau cho các khối 16 byte, khối 64 byte, khối 256 byte và khối 1K, một lần nữa sử dụng mặt nạ bit để quyết định khối nào được sử dụng hoặc có sẵn.
Cả hai tùy chọn này đều có thể giảm chi phí thông tin kế toán và tăng tốc độ malloc
và free
(không cần phải kết hợp các khối liền kề khi giải phóng), đặc biệt quan trọng trong môi trường chúng tôi đang làm việc.