프로그래밍/c++
alignas, alignof 키워드
제페
2016. 5. 7. 21:20
반응형
alignas
메모리의 정렬 단위를 지정하는 키워드로, 다음과 같이 사용합니다.(c++11 이상)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 4 바이트 단위로 정렬된 구조체 struct alignas(4) foo { int a; int b; char c; }; // 8 바이트 단위로 정렬된 구조체 struct alignas(8) bar { int a; int b; char c; }; sizeof(foo) // 결과는 12 sizeof(bar) // 결과는 16 | cs |
클래스, 구조체/공용 구조체 또는 개별 멤버에 alignas를 사용 가능하며 여러 alignas 지정자가 있을 경우, 컴파일러는 가장 엄격한 지정자(가장 큰 값의 지정자)를 선택합니다.
1 2 3 4 5 6 7 8 9 10 | struct alignas(16) bar { int i; // 4 int n; // 4 alignas(4) char arr[3]; // 4 short s; // 2 }; sizeof(bar) // 결과는 16 | cs |
Q) alignas가 #pragma pack을 대체할 수 있을까요?
A) 아뇨.
1 2 3 4 5 6 7 8 9 | #pragma pack(1) struct foo { int type; int size; ... }; | cs |
같은 걸 alignas로 대체하려고 하시겠지만 표준 상에는 이를 허용하지 않습니다. 사용자 정의 데이터에서, alignas는 가장 큰 정렬 단위의 타입에 맞춰져야 합니다. gcc에서는 #pragma pack의 대체가 가능하나, 이는 gcc가 너무 관대하기 때문입니다. (gcc 엿먹어)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | struct alignas(1) foo0 // 가능! { char a; char b; char c; }; struct alignas(1) foo1 // 불가능! alignas는 sizeof(short)보다 커야 함 { char a; char b; short c; // 2 }; struct alignas(4) foo2 // 불가능! alignas는 sizeof(double)보다 커야 함 { int a; int b; int c; double d; // 8 }; | cs |
alignof
alignof(foo)와 같이 사용하며 타입의 맞춤 단위를 반환합니다.
반응형