IT이야기

"__attribute__(포장, 정렬(4))"의 의미는 무엇인가?

cyworld 2022. 4. 19. 22:14
반응형

"__attribute__(포장, 정렬(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;

그것의 의미와 이 키워드를 어떻게 사용하는지 나에게 말해줘.

대답하기 전에 위키로부터 자료를 몇 가지 알려드리고자 한다.


데이터 구조 정렬은 컴퓨터 메모리에서 데이터가 배열되고 접근되는 방식이다.데이터 정렬데이터 구조 패딩의 두 가지 별개의 관련 문제로 구성된다.

현대의 컴퓨터가 메모리 주소에서 읽거나 쓸 때, 단어 크기의 청크(예: 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 Ball4바이트 경계에서 시작됨(즉, 모든 경우에)struct Ball주소는 4로 나눌 수 있다.

이것들은 어떤 C 표준의 일부가 아니라 GCC 확장이다.

속성packed컴파일러가 필드 사이에 패딩을 추가하지 않음을 의미함struct. 패딩은 일반적으로 자연 크기에 맞춰 필드를 만드는 데 사용된다. 일부 아키텍처는 비정렬 액세스에 대해 위약금을 부과하거나 아예 허용하지 않기 때문이다.

aligned(4)구조물은 4로 나눌 수 있는 주소로 정렬되어야 한다는 것을 의미한다.

참조URL: https://stackoverflow.com/questions/11770451/what-is-the-meaning-of-attribute-packed-aligned4

반응형