posix_memalign 함수에 정렬을 위해 sizeof(void *)가 필요한 이유는 무엇입니까?

posix_memalign 함수에 정렬을 위해 sizeof(void *)가 필요한 이유는 무엇입니까?

posix_memalign()매뉴얼 페이지 에서 쓰기 alignment매개변수는 이어야 합니다 power of two and a multiple of sizeof(void *).

유사한 프로그램에는 매개변수 만 memalign()필요합니다 .alignmenta power of two

매개변수가 sizeof(void *)의 배수여야 하는데 posix_memalign()그렇지 않은 이유는 무엇입니까 ?alignmentmemalign()

소스 코드(구체적으로 glibc구현) 를 살펴보니 내부적으로 함수가 posix_memalign()호출됩니다 memalign(). 이 두 기능(하나 posix는 일관성이 있고 다른 하나는 일관성이 없음) 의 차이점은 무엇 이며 alignment변수 요구 사항 간에 차이가 있는 이유는 무엇입니까?

기술적인 설명을 주시면 감사하겠습니다. 감사해요.

답변1

이러한 차이는 역사적인 이유 때문입니다.

memalign()귀하가 설명하는 완화된 정렬 요구 사항은 SunOS에 도입되었으며 유지되었습니다.GNU C 라이브러리에서(하지만솔라리스에서).

posix_memalign()POSIX의 일부입니다특히 반환된 포인터가 직접 블록 장치 I/O에 사용될 수 있고 할당된 메모리를 해제하는 데 사용될 수 있도록 보장하기 위해 더 엄격한 정렬 요구 사항이 있습니다 free(). 일부 구현은 memalign()이러한 요구 사항을 충족하지 않습니다. 바라보다Linux 매뉴얼 페이지의 주석. POSIX는 플랫폼 적용 범위를 포함하여 광범위한 애플리케이션으로 기능을 지정하므로 POSIX 준수가 필요한 대부분의 플랫폼에서 구현 문제를 일으키지 않을 만큼 기본 요구 사항이 충분히 강력해야 합니다.

sizeof(void *)플랫폼의 포인터 크기는 위에서 언급한 두 가지를 포함하여 다양한 상황에서 역사적으로 일반적인 최소 정렬 요구 사항이었습니다.

관련 정보