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로 나눌 수있는 주소에 정렬되어야 함을 의미합니다.