-
alignas, alignof 키워드프로그래밍/c++ 2016. 5. 7. 21:20반응형
alignas
메모리의 정렬 단위를 지정하는 키워드로, 다음과 같이 사용합니다.(c++11 이상)
123456789101112131415161718// 4 바이트 단위로 정렬된 구조체struct alignas(4) foo{int a;int b;char c;};// 8 바이트 단위로 정렬된 구조체struct alignas(8) bar{int a;int b;char c;};sizeof(foo) // 결과는 12sizeof(bar) // 결과는 16cs 클래스, 구조체/공용 구조체 또는 개별 멤버에 alignas를 사용 가능하며 여러 alignas 지정자가 있을 경우, 컴파일러는 가장 엄격한 지정자(가장 큰 값의 지정자)를 선택합니다.
12345678910struct alignas(16) bar{int i; // 4int n; // 4alignas(4) char arr[3]; // 4short s; // 2};sizeof(bar) // 결과는 16cs Q) alignas가 #pragma pack을 대체할 수 있을까요?
A) 아뇨.
123456789#pragma pack(1)struct foo{int type;int size;...};cs 같은 걸 alignas로 대체하려고 하시겠지만 표준 상에는 이를 허용하지 않습니다. 사용자 정의 데이터에서, alignas는 가장 큰 정렬 단위의 타입에 맞춰져야 합니다. gcc에서는 #pragma pack의 대체가 가능하나, 이는 gcc가 너무 관대하기 때문입니다. (gcc 엿먹어)
123456789101112131415161718192021struct 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)와 같이 사용하며 타입의 맞춤 단위를 반환합니다.
반응형'프로그래밍 > c++' 카테고리의 다른 글
boost::variant(std::variant c++17) 사용하기 (4) 2016.08.05 boost::any에서의 unsafe_any_cast (3) 2016.06.06 c++11과 14의 brace-or-equal-initializer (0) 2016.05.03 함수에 주석 달기에 대한 생각 (0) 2016.04.24 iostream cerr, clog의 사용 (0) 2016.04.05