[CareerCup] 13.9 Aligned Malloc and Free Function 메모리 요청 및 방출 함수 쌍 작성

2836 단어

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을 방출하면 됩니다.

좋은 웹페이지 즐겨찾기