aligned_malloc()에서 alignment가 뭔가요?

manim의 이미지

aligned_malloc() 과 aligned_free() function를 구현하려고 하는데요

alignment의 개념이 이해가 안되어 질문 드립니다

void * aligned_malloc(size_t bytes, size_t alignment);
void aligned_free(void * p);

여기서 memory의 boundary를 정한다는게 무슨 의미인가요?
alignment라는 value는 memory의 boundary 를 정하는 것이고
앞에 들어가는 bytes는 input의 size가 되는건가요?
그리고 왜 alignment는 2의 배수여야만 하는지요?

이해가 안되서 웹에서 검색하다가 여러개의 코드를 찾았지만..
개념이 이해가 안되니 코드를 봐도 모르겠더라구요:)

void *aligned_malloc (size_t size, size_t alignment) 
{
  void* ptr = malloc(size + alignment);

  if (ptr)
    {
      void* aligned = (void*)(((long)ptr + alignment) & ~(alignment - 1));
      ((void**)aligned)[-1] = ptr;

      return aligned;
    }
  else
    return NULL;
}

뭐 이런 코드가 있었지만...

     void* aligned = (void*)(((long)ptr + alignment) & ~(alignment - 1));
      ((void**)aligned)[-1] = ptr;

이 두 line이 (아마 가장 중요하겠지만?) 무슨 역할을 하는지..
좀 설명해주실 수 없나요? ^^;

owlet의 이미지

메모리를 alignment값(alignment는 1<<n)단위로 할당하는것을 말합니다.
(size + alignment) & ~(alignment-1) 를 하면 size보다 큰 수중 가장 작은 alignment의 배수가 됩니다. 값을 16진수로 비교해보시면 금방 이해가 되실것입니다.