`_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 원문에서 결함 보고 기록을 더 확인할 수 있어요.