`_Alignof`/`alignof` 연산자

_Alignof/alignof 연산자

어떤 타입이 메모리에서 몇 바이트 경계에 정렬돼야 하는지 궁금할 때가 있어요. 그 값을 코드에서 직접 물어보고 싶다면 쓰는 게 _Alignof(C23부터는 alignof) 연산자예요. 피연산자 타입의 정렬 요구(alignment requirement)를 물어보는 연산자예요.

출처: cppreference

본문

_Alignof(C11~, C23에서 deprecated) / alignof(C23~)는 피연산자 타입의 정렬 요구를 질의해요.

문법

_Alignof( type-name ) (since C11, deprecated in C23)
alignof( type-name ) (since C23)

참고: 이 연산자는 C23 이전에는 <stdalign.h> 헤더에서 제공하는 편의 매크로 alignof를 통해 쓰는 게 일반적이었어요.

설명

type-name이 가리키는 타입의 정렬 요구를 반환해요. type-name이 배열 타입이면, 결과는 배열 요소 타입의 정렬 요구예요. type-name은 함수 타입이거나 불완전 타입(incomplete type)일 수 없어요.

결과는 size_t 타입의 정수 상수예요.

피연산자는 평가되지 않아요 (그래서 피연산자에 쓰인 외부 식별자가 정의돼 있을 필요가 없어요). type-name이 VLA 타입이라면 그 크기 표현식도 평가되지 않아요.

주의

일부 C 컴파일러는 비표준 확장으로 _Alignof(C23 이전)/alignof(C23 이후)를 표현식에 쓰는 것을 허용해요.

키워드

alignof, _Alignof

예시

여러 타입의 정렬 요구를 찍어보는 코드예요.

#include <stdalign.h>
#include <stddef.h>
#include <stdio.h>

int main(void)
{
    printf("Alignment of char = %zu\n", alignof(char));
    printf("Alignment of max_align_t = %zu\n", alignof(max_align_t));
    printf("alignof(float[10]) = %zu\n", alignof(float[10]));
    printf("alignof(struct{char c; int n;}) = %zu\n",
            alignof(struct {char c; int n;}));
}

가능한 출력:

Alignment of char = 1
Alignment of max_align_t = 16
alignof(float[10]) = 4
alignof(struct{char c; int n;}) = 4

여기서 눈여겨볼 점이 두 가지예요. alignof(float[10])이 배열 자체가 아니라 요소 타입인 float의 정렬인 4를 반환한다는 점, 그리고 alignof(struct{...})이 멤버 중 가장 큰 정렬 요구인 int의 정렬인 4로 결정된다는 점이에요.

더 알아보기

  • 객체의 정렬 요구를 지정하는 _Alignas/alignas 지정자와 짝을 이뤄요.
  • 정렬(alignment)의 개념과 규칙은 객체와 정렬 문서에서 더 자세히 볼 수 있어요.
  • cppreference의 alignof 원문에서 결함 보고 기록을 더 확인할 수 있어요.