alignas
specifier
(since C++11)
타입 또는 객체의 alignment requirement 를 지정합니다.
목차 |
구문
alignas(
표현식
)
|
|||||||||
alignas(
타입-식별자
)
|
|||||||||
alignas(
팩
...
)
|
|||||||||
설명
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부터) |
키워드
예제
#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++11)
|
타입의 정렬 요구 사항을 획득
(클래스 템플릿) |
|
C 문서
for
_Alignas, alignas
|
|