ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • alignas, alignof 키워드
    프로그래밍/c++ 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)와 같이 사용하며 타입의 맞춤 단위를 반환합니다.


    반응형
Designed by Tistory.