Namespaces
Variants

_Alignas (since C11) (deprecated in C23) , alignas (since C23)

From cppreference.net

객체 선언의 선언 구문에서 나타나, 선언되는 객체의 정렬 요구사항 을 수정하는 타입 지정자 중 하나로 사용됩니다.

목차

구문

_Alignas ( expression ) (1) (C11부터)
alignas ( expression ) (2) (C23부터)
_Alignas ( type ) (3) (C11부터)
alignas ( type ) (4) (C23부터)
expression - 값이 유효한 integer constant expression 또는 0인 임의의 alignment
type - 임의의 type name

키워드 _Alignas 는 편의 매크로 alignas 로도 사용 가능하며, <stdalign.h> 헤더에서 제공됩니다.

(C23 이전)

설명

_Alignas (C23 이전) alignas (C23 이후) 지정자는 비트 필드 가 아니고 register 저장 클래스를 가지지 않는 객체를 선언할 때만 사용할 수 있습니다. 함수 매개변수 선언에서는 사용할 수 없으며, typedef에서도 사용할 수 없습니다.

선언에서 사용될 때, 선언된 객체는 alignment requirement 가 다음으로 설정됩니다

1,2) 결과가 0이 아닌 경우 expression 의 결과
3,4) type 의 정렬 요구 사항, 즉 _Alignof ( type ) (C23 이전) alignof ( type ) (C23 이후)

이로 인해 해당 타입이 자연스럽게 가질 수 있는 정렬이 약화되는 경우를 제외하고.

만약 expression 이 0으로 평가되면, 이 지정자는 아무런 효과가 없습니다.

여러 개의 _Alignas (C23 이전) alignas (C23 이후) 지정자가 동일한 선언에 나타나면, 가장 엄격한 것이 사용됩니다.

_Alignas (C23 이전) alignas (C23 이후) 지정자는 객체의 정의 에만 나타나면 되지만, 선언 중 어느 하나라도 _Alignas (C23 이전) alignas (C23 이후) 를 사용하는 경우 정의에 있는 _Alignas (C23 이전) alignas (C23 이후) 와 동일한 정렬을 지정해야 합니다. 서로 다른 번역 단위에서 동일한 객체에 대해 서로 다른 정렬을 지정하는 경우의 동작은 정의되지 않습니다.

참고 사항

C++에서는 alignas 지정자를 클래스/구조체/공용체 타입과 열거형의 선언에도 적용할 수 있습니다. 이것은 C에서 지원되지 않지만, 구조체 타입의 정렬은 멤버 선언에서 _Alignas (C23 이전) alignas (C23 이후) 를 사용하여 제어할 수 있습니다.

키워드

alignas , _Alignas

예제

#include <stdalign.h>
#include <stdio.h>
// struct sse_t 타입의 모든 객체는 16바이트 경계에 정렬됩니다
// (참고: DR 444 지원 필요)
struct sse_t
{
    alignas(16) float sse_data[4];
};
// struct data 타입의 모든 객체는 128바이트 경계에 정렬됩니다
struct data
{
    char x;
    alignas(128) char cacheline[128]; // 오버-얼라인된 char 배열,
                                      // 오버-얼라인된 char들의 배열이 아님
};
int main(void)
{
    printf("sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)\n",
           sizeof(struct data));
    printf("alignment of sse_t is %zu\n", alignof(struct sse_t));
    alignas(2048) struct data d; // data의 이 인스턴스는 더 엄격하게 정렬됩니다
    (void)d; // "사용되지 않을 수 있음" 경고를 억제합니다
}

출력:

sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array)
alignment of sse_t is 16

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
DR 444 C11 _Alignas 는 구조체와 공용체 멤버에서 허용되지 않았음 허용됨

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 6.7.5 Alignment specifier (p: TBD)
  • 6.2.8 Alignment of objects (p: TBD)
  • 7.15 Alignment <stdalign.h> (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 6.7.5 Alignment specifier (p: 92)
  • 6.2.8 Alignment of objects (p: 36-37)
  • 7.15 Alignment <stdalign.h> (p: 196)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.7.5 정렬 지정자 (p: 127-128)
  • 6.2.8 객체의 정렬 (p: 48-49)
  • 7.15 정렬 <stdalign.h> (p: 268)

참고 항목

다른 모든 스칼라 타입만큼 큰 정렬 요구 사항을 가진 타입
(typedef)
_Alignof (until C23) alignof (since C23) 객체의 정렬 요구 사항을 조회함
(operator)
C++ documentation for alignas specifier