`memalignment` 함수

memalignment 함수 (memalignment)

어떤 포인터가 특정 타입의 정렬 요구를 만족하는지 알고 싶을 때가 있어요. 예를 들어 메모리를 직접 다루는 코드에서 포인터가 가리키는 주소가 얼마나 단단히 정렬되어 있는지 확인하고 싶은 거죠. C23에서 추가된 memalignment가 그 질문에 정확한 답을 돌려줘요.

출처: cppreference

본문

함수 원형

<stdlib.h>에 정의돼 있어요.

size_t memalignment( const void *p );   // (since C23)

설명 (Explanation)

주어진 주소가 만족하는 최대 정렬을 돌려줘요. 반환값은 구현이 지원하는 어떤 정렬 값보다 클 수도 있어요. p가 널 포인터 값이면 0을 돌려줘서, 그 포인터로는 어떤 타입의 객체에도 접근할 수 없다는 뜻을 나타내요.

반환값이 타입 Talignof(T)보다 크거나 같다면, 그 포인터는 T 타입의 정렬 요구를 만족한다는 뜻이에요.

프리스탠딩 구현memalignment를 제공해야 해요.

매개변수 (Parameters)

  • p — 정렬을 질의할 포인터

반환값 (Return value)

p의 정렬 값, 또는 p가 널 포인터 값이면 0.

주의할 점 (Notes)

다음 조건을 모두 만족하는 흔한 플랫폼에서,

  • 널 포인터가 정수 0으로 변환되고,
  • 포인터 값이 가상 주소의 숫자 값으로 직접 변환되며,
  • size_tuintptr_t와 같다면,

이 함수는 return (size_t)p & -(size_t)p;로 구현할 수 있어요.

예제 (Example)

alignas(128)로 정렬된 변수의 주소와 널 포인터의 정렬을 각각 물어보는 예시예요.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    alignas(128) int i = 0;
    printf("%zu\n%zu\n", memalignment(nullptr), memalignment(&i));
}

가능한 출력:

0
128

널 포인터는 0을 돌려주고, 128바이트로 정렬된 i의 주소는 128을 돌려주는 걸 볼 수 있어요.

같이 보기 (See also)

  • aligned_alloc(C11) — 정렬된 메모리 할당
  • free_aligned_sized(C23) — 이전에 할당한 크기·정렬 메모리 해제