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


122

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;

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


4
그것은이다 "type 속성" .. (내가 구글에서 "C 속성이 포장"로이 발견 확실히 다른 사람이 적어도 좋은으로 할 수 있습니다.!)

1
이 질문을 참조하십시오 - aligned(4)당신 과 함께 라면 걱정할 것이 많지 않을 것입니다.
Keith Thompson

답변:


157

대답하기 전에 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)

6
메모리가 4 바이트 청크에 데이터를 저장하는 경우 서명되지 않은 짧은 (2 바이트 길이)에 2 패딩 바이트를 추가하지 않는 이유는 무엇입니까? 또는 컴파일러는 구조의 첫 번째 및 마지막 멤버에 패딩 바이트를 추가합니까? 명확히 해주시 겠어요?
User

5
@User Plz도 이것을 참조하십시오. 그래도 해결되지 않으면, PLZ 도움을 위해 올 stackoverflow.com/questions/11772553/...
Jeyaram

이 패딩 바이트가 무의미하다고 말하는 사람은 잘못 정렬 된 데이터 액세스가 x86 아키텍처의 이상하다는 사실을 모릅니다. 이러한 바이트는 프로세서가 자연스러운 정렬 경계에 걸쳐있는 데이터 (예 : 정수)를로드하려고 할 때 예외를 방지하는 데 필요합니다.
Tanveer Badar 19

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

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


17

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.