새로운 난해한 프로그래밍 언어를 설계하고 있으며 추가하기로 결정한 기능 중 하나는 동적 메모리 할당 자입니다. 귀하의 언어는 사용자의 프로그램 공간을위한 특별한 전용 가상 주소 공간을 지정합니다. 이것은 메모리 할당자가 내부 상태에 사용하는 주소 공간과 별개입니다.
구현 배포 비용을 줄이려면 코드 크기가 가능한 작아야합니다.
상호 작용
초기화, 할당 및 할당 해제의 세 가지 기능을 제공해야합니다.
초기화
이 함수는 단일 양의 정수 매개 변수를 사용 N합니다. 즉, 사용자 프로그램 N의 주소 공간 N-1에 메모리를 할당 할 바이트 가있는 바이트가 있습니다. 주소 0는 "널"로 예약되어 있습니다.
이 함수는 할당 / 할당 해제 호출 전에 정확히 한 번만 호출됩니다.
이 함수는 사용자 프로그램의 가상 주소 공간을위한 물리적 메모리를 할당 할 필요가 없습니다. 당신은 기본적으로 할로우 메모리 할당 자의 "모양과 느낌"을 만들고 있습니다.
할당
할당 함수는 할당 할 메모리 바이트 수를 요청해야합니다. 입력은 양수로 보장됩니다.
함수는 할당 된 블록의 시작 부분에 정수 주소를 반환하거나 0사용 가능한 요청 된 크기의 연속 블록이 없음을 나타내야합니다 . 사용 가능한 크기의 연속 블록이 주소 공간의 어느 곳에서나 사용 가능하면 할당해야합니다!
할당 된 두 블록이 겹치지 않도록해야합니다.
할당 해제
할당 해제 기능은 할당 된 블록의 시작 주소를 가져와야하며, 주어진 블록의 크기를 선택적으로 가질 수도 있습니다.
할당이 해제 된 메모리는 다시 할당 할 수 있습니다. 입력 주소가 유효한 주소라고 가정합니다.
파이썬 구현 예
내부 상태를 추적하는 방법을 선택할 수 있습니다. 이 예제에서 클래스 인스턴스는이를 추적합니다.
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]
채점
이것은 코드 골프입니다. 바이트 단위의 가장 짧은 코드가 이깁니다. 할당 자에 필요한 내부 상태에 대한 메모리 부족에 대해 걱정할 필요가 없습니다.
표준 루프 구멍이 적용됩니다.
리더 보드
To help reduce the cost of distributing your implementation the size of the code must be as small as possible아니면 가능한 한 효율적일 수 있습니까 (작고 효율적이지는 않습니까)? : D