[c] “__attribute __ ((packed, alignment (4)))”의 의미는 무엇입니까?

C 언어입니다.

typedef struct __attribute__((packed, aligned(4))) Ball {
    float2 delta;
    float2 position;
    //float3 color;
    float size;
    //int arcID;
    //float arcStr;
} Ball_t;
Ball_t *balls;

그 의미와 키워드 사용법을 알려주세요.



답변

대답하기 전에 Wiki의 데이터를 제공하고 싶습니다.


데이터 구조 정렬 은 데이터가 컴퓨터 메모리에서 배열되고 액세스되는 방식입니다. 데이터 정렬데이터 구조 패딩 이라는 두 가지 별개의 관련 문제로 구성됩니다 .

현대 컴퓨터가 메모리 주소에서 읽거나 쓸 때 워드 크기의 청크 (예 : 32 비트 시스템의 경우 4 바이트 청크)로이를 수행합니다. 데이터 정렬 은 데이터를 워드 크기의 배수에 해당하는 메모리 오프셋에 배치 하는 것을 의미하며, 이는 CPU가 메모리를 처리하는 방식으로 인해 시스템 성능을 향상시킵니다.

데이터를 정렬하려면 마지막 데이터 구조의 끝과 다음 데이터 구조 패딩 의 시작 사이에 의미없는 바이트를 삽입해야 할 수 있습니다 .


gcc는 구조 패딩을 비활성화하는 기능을 제공합니다. 즉, 어떤 경우에는 이러한 의미없는 바이트를 피하는 것입니다. 다음 구조를 고려하십시오.

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}sSampleStruct;

sizeof(sSampleStruct)8이 아니라 12가됩니다. 구조 패딩 때문입니다. 기본적으로 X86에서는 구조가 4 바이트 정렬로 채워집니다.

typedef struct
{
     char Data1;
     //3-Bytes Added here.
     int Data2;
     unsigned short Data3;
     char Data4;
     //1-byte Added here.

}sSampleStruct;

__attribute__((packed, aligned(X)))특정 (X) 크기의 패딩을 주장 하는 데 사용할 수 있습니다 . X는 2의 거듭 제곱이어야합니다. 여기를 참조 하십시오

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}__attribute__((packed, aligned(1))) sSampleStruct;  

따라서 위에 지정된 gcc 속성은 구조 패딩을 허용하지 않습니다. 따라서 크기는 8 바이트가됩니다.

모든 구조에 대해 동일하게 수행하려면 다음을 사용하여 정렬 값을 스택에 푸시 할 수 있습니다. #pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)


답변

  • packed즉, 가능한 한 가장 작은 공간을 사용합니다. struct Ball즉, 패딩없이 필드를 함께 밀어 넣습니다.
  • aligned각각 struct Ball은 4 바이트 경계에서 시작 함을 의미합니다. 즉, 임의의 struct Ball경우 주소를 4로 나눌 수 있습니다.

이들은 C 표준의 일부가 아닌 GCC 확장입니다.


답변

이 속성 packed은 컴파일러가 struct. 일부 아키텍처에서는 정렬되지 않은 액세스에 대해 페널티를 부과하거나 전혀 허용하지 않기 때문에 패딩은 일반적으로 필드를 원래 크기로 정렬하는 데 사용됩니다.

aligned(4) 구조체가 4로 나눌 수있는 주소에 정렬되어야 함을 의미합니다.


답변