2014-10-07 2 views
0

구조체의 정렬 크기에 대해 구조체의 최대 멤버 크기와 동일한 정렬 크기를 사용해야하는 이유를 알고 싶습니다. , char Data1 후,구조체에 메모리 정렬 - 최대 멤버 크기와 동일한 정렬 크기

struct MixedData /* After compilation in 32-bit x86 machine */ 
{ 
    char Data1; /* 1 byte */ 
    char Padding1[1]; /* 1 byte for the following 'short' to be aligned on a 2 byte boundary 
         assuming that the address where structure begins is an even number */ 
    short Data2; /* 2 bytes */ 
    int Data3; /* 4 bytes - largest structure member */ 
    char Data4; /* 1 byte */ 
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */ 
}; 

을하지만 내가 왜이 없습니다 :

예 :

struct MixedData 
{ 
    char Data1; 
    short Data2; 
    int Data3; 
    char Data4; 
}; 

우리는 정렬이 4 바이트, 최대 규모의 멤버 (int Data3) 가지고가는 경우에, 그래서 우리가해야 할 char Padding1[3]이므로 short Data2char Data1[1] 대신 adress(Data1) + 4에서 시작됩니까?

동일한 로직을 사용하면 이후에 short Padding3[1]이 표시되지 않는 이유는 무엇입니까?

또 다른 질문 : 저는 64 비트 프로세서입니다 경우, 나는 8 바이트의 alignement를 사용한다, 그래서 나는 다음과 같은 설정해야합니다 :

struct MixedData /* After compilation in 64-bit x86_64 machine */ 
{ 
    char Data1; /* 1 byte */ 
    char Padding1[7]; /* 7 bytes */ 
    int Data3; 
    int Padding2[1]/* 4 bytes */ 
    char Data4; 
    char Padding3[7]; /* 7 bytes to make total size of the structure 24 bytes */ 
}; 

?

총 크기가 24 바이트가 8 바이트의 배수입니까?

+3

패딩은 일반적으로 '자연'으로 이루어집니다 : 물론 것

struct X { char c; uint64_t x; }; 

필드를 정렬하십시오. 즉, dword 필드는 dword로 정렬되고, word 필드는 단어로 정렬됩니다. 말하자면, dword 정렬되지는 않지만 (단어 정렬 된) 단어 크기 필드에 액세스 할 경우 패널티가 없습니다. –

+0

@ 500-InternalServerError : 답변 대신 메모로 게시해야합니다. –

답변

0

구조의 전체 정렬은 정렬 요구 사항이 가장 높은 요소의 정렬이어야합니다. 이는 예를 들어 구조체 배열이 항상 정렬되도록하는 데 필요합니다. 아직 가지고 있지 않다면, struct { int x; char c; };의 크기는 첫 번째 요소가 정렬되지만, 다음 세 요소는 정렬되지 않은 x이됩니다.

"패킹 된"데이터 구조 (정렬 패딩이 없음)를 생성하고이를 사용하여 패킹 된 배열을 얻도록 컴파일러를 설득 할 수는 있지만, 매우 특별한 경우를 제외하고는이를 사용하는 것은 좋지 않습니다. 기껏해야 속도가 느리기 때문에 최악의 경우 프로세서에서 "정렬되지 않은 액세스 트랩"으로 인해 실행이 중지됩니다.

int의 크기가 4 바이트 인 경우 [long은 컴파일러에 따라 4 또는 8 바이트입니다.] 최소 32 비트 및 64 비트 x86)은 4 바이트 정렬됩니다. 당신이 구조체의 7 바이트 "격차"를 갖고 싶어

이 작동합니다 :

struct X { 
    char c; 
    char padding[7]; 
    uint64_t x; 
};