프로그래밍/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(4char 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)와 같이 사용하며 타입의 맞춤 단위를 반환합니다.


반응형