_Alignas (since C11) (deprecated in C23) , alignas (since C23)
객체 선언의 선언 구문에서 나타나, 선언되는 객체의 정렬 요구사항 을 수정하는 타입 지정자 중 하나로 사용됩니다.
목차 |
구문
_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 |
|
키워드
|
(C23 이전) |
설명
_Alignas
(C23 이전)
alignas
(C23 이후)
지정자는
비트 필드
가 아니고
register
저장 클래스를 가지지 않는 객체를 선언할 때만 사용할 수 있습니다. 함수 매개변수 선언에서는 사용할 수 없으며, typedef에서도 사용할 수 없습니다.
선언에서 사용될 때, 선언된 객체는 alignment requirement 가 다음으로 설정됩니다
이로 인해 해당 타입이 자연스럽게 가질 수 있는 정렬이 약화되는 경우를 제외하고.
만약 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 이후)
를 사용하여 제어할 수 있습니다.
키워드
예제
#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)
참고 항목
|
(C11)
|
다른 모든 스칼라 타입만큼 큰 정렬 요구 사항을 가진 타입
(typedef) |
| _Alignof (until C23) alignof (since C23) |
객체의 정렬 요구 사항을 조회함
(operator) |
|
C++ documentation
for
alignas
specifier
|
|