Bạn đang thiết kế một ngôn ngữ lập trình bí truyền mới và một tính năng bạn quyết định thêm là phân bổ bộ nhớ động. Ngôn ngữ của bạn chỉ định một không gian địa chỉ ảo dành riêng cho không gian chương trình của người dùng. Điều này tách biệt với không gian địa chỉ được sử dụng bởi bộ cấp phát bộ nhớ cho bất kỳ trạng thái bên trong nào.
Để giúp giảm chi phí phân phối việc triển khai của bạn, kích thước của mã phải càng nhỏ càng tốt.
Giao diện
Bạn phải cung cấp ba chức năng: khởi tạo, phân bổ và phân bổ.
Khởi tạo
Hàm này có một tham số nguyên dương duy nhất N. Điều này có nghĩa là chương trình của người dùng có Nbyte trong không gian địa chỉ mà từ đó có N-1byte để phân bổ bộ nhớ. Địa chỉ 0được dành riêng cho "null".
Nó được đảm bảo rằng chức năng này sẽ được gọi chính xác một lần trước khi có bất kỳ cuộc gọi phân bổ / thỏa thuận nào.
Lưu ý rằng chức năng này không cần phân bổ bất kỳ bộ nhớ vật lý nào cho không gian địa chỉ ảo của chương trình người dùng; về cơ bản bạn đang tạo ra "giao diện" của bộ cấp phát bộ nhớ rỗng.
Chỉ định
Hàm cấp phát phải lấy một yêu cầu về số byte bộ nhớ để phân bổ. Đầu vào được đảm bảo là tích cực.
Hàm của bạn phải trả về một địa chỉ số nguyên cho đầu khối được phân bổ hoặc 0để biểu thị rằng không có khối liền kề nào có kích thước được yêu cầu. Nếu một khối liền kề của kích thước có sẵn có sẵn ở bất cứ đâu trong không gian địa chỉ bạn phải phân bổ!
Bạn phải đảm bảo rằng không có hai khối được phân bổ trùng nhau.
Giao dịch viên
Hàm deallocate phải lấy một địa chỉ bắt đầu của một khối được phân bổ và tùy ý cũng có thể lấy kích thước của khối đã cho.
Bộ nhớ đã được xử lý lại có sẵn để phân bổ. Giả định rằng địa chỉ đầu vào là một địa chỉ hợp lệ.
Ví dụ triển khai Python
Lưu ý rằng bạn có thể chọn bất kỳ phương pháp nào để theo dõi trạng thái nội bộ; trong ví dụ này, cá thể lớp theo dõi nó.
class myallocator:
def __init__(self, N):
# address 0 is special, it's always reserved for null
# address N is technically outside the address space, so use that as a
# marker
self.addrs = [0, N]
self.sizes = [1, 0]
def allocate(self, size):
for i,a1,s1,a2 in zip(range(len(self.addrs)),
self.addrs[:-1], self.sizes[:-1],
self.addrs[1:]):
if(a2 - (a1+s1) >= size):
# enough available space, take it
self.addrs.insert(i+1, a1+s1)
self.sizes.insert(i+1, size)
return a1+s1
# no contiguous spaces large enough to take our block
return 0
def deallocate(self, addr, size=0):
# your implementation has the option of taking in a size parameter
# in this implementation it's not used
i = self.addrs.index(addr)
del self.addrs[i]
del self.sizes[i]
Chấm điểm
Đây là mã golf; mã ngắn nhất trong byte thắng. Bạn không cần lo lắng về việc hết bộ nhớ cho bất kỳ trạng thái nội bộ nào theo yêu cầu của người cấp phát.
Lỗ vòng tiêu chuẩn áp dụng.
Bảng xếp hạng
To help reduce the cost of distributing your implementation the size of the code must be as small as possiblehoặc nó có thể hiệu quả (nhỏ và hiệu quả không giống nhau) càng tốt? : D