2013-05-25 5 views
7

안녕하세요,
유니언이 패딩을 사용하고 있는지 알고 싶습니까?
유니온의 크기가 가장 큰 데이터 멤버 크기이기 때문에 마지막에 패딩이있을 수 있습니까? 가장 큰 크기의 데이터가 어쨌든 경계에 정렬되어 있기 때문에 패딩을 사용하지 않는 것처럼유니온의 패딩이 존재하는지 여부

union 
{ 
    char c; 
    int x; 
} 

것 같다 내부

+1

짧게 ** ** ** 내 Windows 시스템에서 공용 구조체는 'int'크기의 배수 인 크기로 채워져 있습니다 (예 : ** 4 바이트 **). '#pragma pack (1)'을 사용하면 크기가 3 바이트 인 공용체가 하나의 바이트로 더 채워져 4 바이트가됩니다. 프로그램을 작성하고 질문을 게시하기 전에 시도하십시오. –

+0

"유니온은 int 크기의 배수, 즉 4 바이트 크기로 채워집니다." 이 경우 노동 조합 ab { char a; } a; 크기는 1 – akash

+1

귀하의 경우에는 전혀 패딩이 없습니다. 누가 항상 '패딩'을했다고 했습니까? 다니엘 피셔 (Daniel Fischer)와 마찬가지로, 표준에 따라 ** 위임되지 않았습니다 **. –

답변

-3

연합 (EU) 우리는 원시 형으로 사용할 때.

하지만 우리가 구조 내에 구조를 중첩 할 때.

union u 
    { 
     struct ss 
     { 
      char s; 
      int v; 
     }xx; 
    }xu; 

그것은 패딩은 UNION에서 persent입니다 그래서 귀하의 질문에 대한 답변

크기 8 결과. 노동 조합의 크기부터

+1

이 경우 이미'struct '에 패딩이 있습니다. –

+0

Daniel은 이것이 잘못된 것이라고 제안했습니다. 오해의 소지가있는 구조체의 패딩을 참조하는 것입니다. – kadina

14

사실 일 필요는 없다 최대 규모의 데이터 멤버 크기

입니다. 고려하십시오

union Pad { 
    char arr[sizeof (double) + 1]; 
    double d; 
}; 

해당 조합의 가장 큰 구성원은 arr입니다. 그러나 일반적으로 double은 4 바이트 또는 8 바이트의 배수로 정렬됩니다 (아키텍처 및 크기에 따라 달라질 수 있습니다. double). 일부 아키텍처에서는 정렬되지 않은 읽기를 전혀 지원하지 않기 때문에 필요합니다.

그래서 sizeof (union Pad) 8 비트 char 및 64 비트 double 가진 32 비트 시스템에 대한 32 비트 시스템 (ON 중 16 또는 12 sizeof (double) + 1 [64 비트 시스템에 일반적 16 = 2 * sizeof (double)보다 일반적으로 크고, 필요한 double에 대한 정렬은 여전히 ​​4 바이트 일 수 있습니다.

즉, 유니언에 패딩이 있어야하며 그 패딩은 마지막에만 위치 할 수 있음을 의미합니다.

일반적으로 union의 크기는 가장 큰 구성원보다 작지 않은 구성원이 요구하는 최대 정렬 중 가장 작은 배수가됩니다.

+0

하지만 우리가 char arr [sizeof (double) +1]을 노조에 가지고있을 때 그 크기는 단지 9를 제공합니까? – Dineshkumar

+0

이것은 표준에서 요구하는 것은 아니지만, 구현시 패딩을 추가 할 수 있지만 일반적으로 (8 바이트'double's) 예 9의 크기가됩니다. –

+0

누구든지이 예제가 위로 패드? - 여기에 덧붙여 야 할 이유가 없다고 생각하기 때문에 물어 봅니다. 두 멤버 사이에 공간이 있어야하는 것처럼, 가장 큰 것을 선택해야합니다. – ideasman42

관련 문제