Namespaces
Variants

alignas specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

타입 또는 객체의 alignment requirement 를 지정합니다.

목차

구문

alignas( 표현식 )
alignas( 타입-식별자 )
alignas( ... )
1) expression 은(는) 0으로 평가되거나 integral constant expression 이어야 하며, 유효한 alignment 값 또는 확장 정렬 값이어야 합니다.
2) 다음에 해당함: alignas ( alignof ( type-id ) ) .
3) parameter pack 의 각 멤버에 대해 동일 선언에 여러 alignas 지정자가 적용된 것과 동등합니다. 여기서 parameter pack은 타입 또는 상수 parameter pack일 수 있습니다.

설명

alignas 지정자는 다음에 적용될 수 있습니다:

  • class 의 선언 또는 정의;
  • 비트필드가 아닌 클래스 데이터 멤버의 선언;
  • 다음 항목에는 적용할 수 없다는 점을 제외한 변수의 선언:
    • 함수 매개변수;
    • catch 절의 예외 매개변수.

이러한 선언으로 선언된 객체 또는 타입은 해당 선언에서 사용된 모든 alignas 지정자의 가장 엄격한(가장 큰) 0이 아닌 expression 과 동일한 alignment requirement 를 가지게 됩니다. 단, 이로 인해 타입의 자연 정렬이 약화되는 경우는 제외됩니다.

선언에서 가장 엄격한(가장 큰) alignas 지정자가 어떠한 alignas 지시자 없이 가질 수 있는 정렬(즉, 자연 정렬 또는 동일한 객체나 타입의 다른 선언에서의 alignas 보다 약한 경우)보다 약하면 프로그램은 형식 오류입니다:

struct alignas(8) S {};
struct alignas(1) U { S s; }; // 오류: alignas(1) 없이 U의 정렬은 8이었을 것입니다

유효하지 않은 0이 아닌 정렬 값, 예를 들어 alignas ( 3 ) 는 잘못된 형식입니다.

동일한 선언에서 다른 alignas 보다 약한 유효한 0이 아닌 정렬은 무시됩니다.

alignas ( 0 ) 는 항상 무시됩니다.

참고 사항

ISO C11 표준 기준으로, C 언어는 _Alignas 키워드를 가지며, alignas 를 헤더 파일 <stdalign.h> 에서 해당 키워드로 확장되는 전처리기 매크로로 정의합니다.

C++에서 this는 키워드이며,

헤더 <stdalign.h> <cstdalign> 는 해당 매크로를 정의하지 않습니다. 그러나 매크로 상수 __alignas_is_defined 는 정의합니다.

(C++20까지)

헤더 <stdalign.h> 는 해당 매크로를 정의하지 않습니다. 그러나 매크로 상수 __alignas_is_defined 는 정의합니다.

(C++20부터)

키워드

alignas

예제

#include <iostream>
// struct_float 타입의 모든 객체는
// alignof(float) 경계(보통 4)에 정렬됩니다:
struct alignas(float) struct_float
{
    // 여기에 정의를 작성하세요
};
// sse_t 타입의 모든 객체는 32바이트 경계에 정렬됩니다:
struct alignas(32) sse_t
{
    float sse_data[4];
};
int main()
{
    struct default_aligned
    {
        float data[4];
    } a, b, c;
    sse_t x, y, z;
    std::cout
        << "alignof(struct_float) = " << alignof(struct_float) << '\n'
        << "sizeof(sse_t) = " << sizeof(sse_t) << '\n'
        << "alignof(sse_t) = " << alignof(sse_t) << '\n'
        << std::hex << std::showbase
        << "&a: " << &a << "\n"
           "&b: " << &b << "\n"
           "&c: " << &c << "\n"
           "&x: " << &x << "\n"
           "&y: " << &y << "\n"
           "&z: " << &z << '\n';
}

가능한 출력:

alignof(struct_float) = 4
sizeof(sse_t) = 32
alignof(sse_t) = 32
&a: 0x7fffcec89930
&b: 0x7fffcec89940
&c: 0x7fffcec89950
&x: 0x7fffcec89960
&y: 0x7fffcec89980
&z: 0x7fffcec899a0

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
CWG 1437 C++11 alignas를 별칭 선언에서 사용할 수 있었음 금지됨
CWG 2354 C++11 alignas를 열거형 선언에 적용할 수 있었음 금지됨

참조문헌

  • C++23 표준 (ISO/IEC 14882:2024):
  • 9.12.4 Carries dependency 속성 [dcl.attr.depend]
  • C++20 표준(ISO/IEC 14882:2020):
  • 9.12.3 Carries dependency 속성 [dcl.attr.depend]
  • C++17 표준(ISO/IEC 14882:2017):
  • 10.6.3 Carries dependency 속성 [dcl.attr.depend]
  • C++14 표준(ISO/IEC 14882:2014):
  • 7.6.4 의존성 전파 속성 [dcl.attr.depend]
  • C++11 표준 (ISO/IEC 14882:2011):
  • 7.6.4 Carries dependency 속성 [dcl.attr.depend]

참고 항목

alignof (C++11) 타입의 정렬 요구 사항을 조회
(연산자)
타입의 정렬 요구 사항을 획득
(클래스 템플릿)
C 문서 for _Alignas, alignas