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