[CareerCup] 13.9 Aligned Malloc and Free Function 메모리 요청 및 방출 함수 쌍 작성
13.9 Write an aligned malloc and free function that supports allocating memory such that the memory address returned is divisible by a specific power of two. EXAMPLE align_malloc (1000,128) will return a memory address that is a multiple of 128 and that points to memory of size 1000 bytes. aligned_free() will free memory allocated by align_malloc
이 문제는 우리가 메모리를 신청하고 방출하는 함수를 한 쌍 쓰고, 우리가 신청한 메모리 블록의 시작 주소가 2의 배수로 정리될 수 있도록 요구한다.제목에서 예를 들어 1000바이트 크기의 메모리 공간을 신청하고 시작 주소는 128로 정리할 수 있도록 합니다.우리는malloc를 사용하여 메모리를 신청할 때 더미 속의 구체적인 메모리가 신청되는지 제어할 수 없다는 것을 알고 있다. 만약에 우리가 굳이 첫 번째 주소가 128로 정리되어야 한다면 우리는 작은 기교가 필요하다. 우리는 127바이트 크기를 다시 신청해야 한다. 이렇게 하면 우리의 첫 주소가 128로 정리되지 않고 정리할 수 있는 위치로 조정할 수 있으며 뒤의 메모리 공간도 1000바이트에 충분하다.다음과 같은 코드를 사용하여 신청할 수 있습니다.
void* aligned_malloc(size_t required_bytes, size_t alignment) {
int offset = alignment - 1;
void *p = (void*)malloc(required_bytes + offset);
void *q = (void*)(((size_t)(p1) + offset) & ~(alignment - 1));
return q;
}
우리는 추가 공간alignment-1을 신청한 다음에 첫 번째 주소의 위치를 조정하여 ~(alignment-1)와 비교하여 alignment에 의해 제거될 수 있는 주소를 얻었다. 다음은 우리가 어떻게 메모리를 방출하는지 보려고 한다. 왜냐하면 우리는offset의 메모리를 많이 신청했기 때문에 최종적으로 이 메모리를 방출해야 한다. 우리는 전체 메모리 블록의 시작 위치를 기록하는 지침이 필요하다. 지침이 새로 추가되었기 때문이다.바늘에 신청 공간을 주는 것을 잊지 마세요. 그래서 저희가 더 신청해야 하는 공간의 크기는 alignment-1+sizeof(void*)입니다. 아래 코드를 참고하십시오.
class Solution {
public:
void* aligned_malloc(size_t required_bytes, size_t alignment) {
void *p1;
void **p2;
int offset = alignment - 1 + sizeof(void*);
if ((p1 = (void*)malloc(required_bytes + offset)) == NULL) {
return NULL;
}
p2 = (void**)(((size_t)(p1) + offset) & ~(alignment - 1));
p2[-1] = p1;
return p2;
}
void aligned_free(void *p2) {
void *p1 = ((void**)p2)[-1];
free(p1);
}
};
우리는 이중 바늘 p2를 정의합니다. -1의 위치에 p1을 저장합니다. 즉, 전체 신청한 메모리 블록의 시작 주소입니다. 0의 위치에 alignment에 의해 제거될 수 있는 위치를 저장하고 메모리를 방출할 때 p2에서 p1을 추출하여 p1을 방출하면 됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.