alignof 연산자

alignof 연산자 (C++11)

타입이 몇 바이트 경계에 정렬되어야 하는지 궁금할 때가 있어요. 그 값을 컴파일 타임에 알려주는 게 alignof 연산자예요. 이 페이지에서 alignof가 정확히 무엇을 반환하고, 어떤 타입에 쓸 수 있는지 정리해 볼게요.

출처: cppreference

본문

alignof는 타입의 정렬 요구를 조회해요.

문법

alignof( type-id )

std::size_t 타입의 값을 반환해요.

설명

type-id가 가리키는 타입에 필요한 정렬(바이트 단위)을 반환해요. type-id는 완전 객체 타입(complete object type), 요소 타입이 완전한 배열 타입, 또는 그런 타입들 중 하나에 대한 참조 타입이어야 해요.

타입이 참조 타입이면 연산자는 참조되는 타입의 정렬을 반환해요. 타입이 배열 타입이면 요소 타입의 정렬 요구를 반환해요.

주의

alignof가 반환하는 값의 의미와 속성은 '정렬(alignment)' 문서를 참고하면 돼요.

키워드

alignof

예시

#include <iostream>

struct Foo
{
    int   i;
    float f;
    char  c;
};

// 아래의 alignas(alignof(long double))은 원하면
// alignas(long double)로 간단히 쓸 수 있어요.
struct alignas(alignof(long double)) Foo2
{
    // 여기에 정의
}; 

struct Empty {};

struct alignas(64) Empty64 {};

#define SHOW(expr) std::cout << #expr << " = " << (expr) << '\n'

int main()
{
    SHOW(alignof(char));
    SHOW(alignof(int*));
    SHOW(alignof(Foo));
    SHOW(alignof(Foo2));
    SHOW(alignof(Empty));
    SHOW(alignof(Empty64));
}

가능한 출력:

alignof(char) = 1
alignof(int*) = 8
alignof(Foo) = 4
alignof(Foo2) = 16
alignof(Empty) = 1
alignof(Empty64) = 64

alignof(Foo)가 4인 걸 보면 Foo의 정렬이 가장 크게 정렬되는 멤버인 int(4바이트)의 정렬을 따른다는 걸 알 수 있어요. alignof(Empty64)alignas(64)로 정렬 요구를 키웠기 때문에 64예요.

더 알아보기

  • 정렬을 지정하는 alignas 지정자와 짝을 이뤄요.
  • 정렬(alignment)의 의미와 속성에 대한 자세한 내용은 정렬 문서에서 볼 수 있어요.
  • cppreference의 alignof 원문에서 결함 보고 기록을 더 볼 수 있어요.