4.1.11. __packed

__packed 한정자는 유효한 정렬을 1로 설정합니다. 이것은 다음을 의미합니다.

__packed 한정자는 __packed를 사용하여 선언될 경우 구조체 또는 공용체의 모든 구성원에게 적용됩니다. 구성원 사이에 또는 구조체 끝에 패딩이 없습니다. 패킹된 구조체의 모든 하위 구조체는 __packed를 사용하여 선언해야 합니다. 패킹되지 않은 구조체의 필수 하위 필드는 개별적으로 패킹될 수 있습니다.

사용법

__packed 한정자는 구조체를 외부 데이터 구조체에 매핑하거나 정렬되지 않은 데이터에 액세스할 경우 유용하지만, 일반적으로 액세스 비용이 비교적 높기 때문에 데이터 크기를 줄이는 데는 유용하지 않습니다. 패킹이 필요한 구조체에서 필드를 패킹하는 것만이 정렬되지 않은 액세스의 수를 줄일 수 있습니다.

Note

하드웨어의 미정렬 액세스를 지원하지 않는 ARM 프로세서(예: ARMv6 이전)에서 미정렬 데이터에 대한 액세스는 코드 크기와 실행 속도 면에서 비용이 많이 들 수 있습니다. 패킹된 구조체를 통한 데이터 액세스는 코드 크기 증가와 성능 손실을 막기 위해 최소화되어야 합니다.

제한

__packed 사용 시 다음 제한이 적용됩니다.

  • __packed 한정자는 __packed 없이 이전에 선언된 구조체에서는 사용할 수 없습니다.

  • 다른 유형의 한정자와 달리, 동일한 구조체 유형의 __packed와 비 -__packed 버전을 동시에 가질 수는 없습니다.

  • __packed 한정자는 정수 유형의 지역 변수에 영향을 주지 않습니다.

  • 패킹된 구조체나 공용체는 패킹되지 않은 해당 구조체와 할당 호환성이 없습니다. 구조체는 다른 메모리 레이아웃을 갖고 있으므로 패킹된 구조체를 패킹되지 않은 구조체로 할당하는 유일한 방법은 한 필드씩 복사하는 것입니다.

  • __packed를 캐스트하는 효과는 정의되지 않습니다. 패킹되지 않은 구조체를 패킹된 구조체로 캐스트하는 효과는 정의되지 않습니다. 정수 유형에 대한 포인터는 패킹된 정수 유형에 대한 포인터로 암시적으로 또는 명시적으로 올바르게 캐스트될 수 있습니다. char 유형에서도 __packed를 캐스트할 수 있습니다.

  • 패킹된 배열 유형은 없습니다 패킹된 배열은 패킹된 유형을 가진 개체의 배열입니다. 배열에 패딩이 없습니다.

예제

Example 4.4에서는 포인터가 패킹된 유형을 가리킬 수 있음을 보여 줍니다.

Example 4.4. 패킹된 유형에 대한 포인터

typedef __packed int* PpI;          /* pointer to a __packed int */
__packed int *p;                    /* pointer to a __packed int */
PpI p2;                             /* 'p2' has the same type as 'p' */
                                    /* __packed is a qualifier  */
                                    /* just like 'const' or 'volatile' */

typedef int *PI;                    /* pointer to int */
__packed PI p3;                     /* a __packed pointer to a normal int */
                                    /*  -- not the same type as 'p' and 'p2' */

int *__packed p4;                   /* 'p4' has the same type as 'p3' */

Example 4.5에서는 패킹된 개체가 포인터를 사용하여 액세스될 경우 컴파일러에서 포인터 정렬과 독립적으로 작동하는 코드를 생성하는 것을 보여 줍니다.

Example 4.5. 패킹된 구조체

typedef __packed struct
{
    char x;                   // all fields inherit the __packed qualifier	
    int y;
} X;                          // 5 byte structure, natural alignment = 1	

int f(X *p)
{
    return p->y;              // does an unaligned read
}

typedef struct
{
    short x;
    char y;
    __packed int z;           // only pack this field
    char a;
} Y;                          // 8 byte structure, natural alignment = 2

int g(Y *p)
{
    return p->z + p->x;       // only unaligned read for z
}

추가 참고

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0348AK
Non-Confidential