안녕하세요,
유니언이 패딩을 사용하고 있는지 알고 싶습니까?
유니온의 크기가 가장 큰 데이터 멤버 크기이기 때문에 마지막에 패딩이있을 수 있습니까? 가장 큰 크기의 데이터가 어쨌든 경계에 정렬되어 있기 때문에 패딩을 사용하지 않는 것처럼유니온의 패딩이 존재하는지 여부
union
{
char c;
int x;
}
것 같다 내부
안녕하세요,
유니언이 패딩을 사용하고 있는지 알고 싶습니까?
유니온의 크기가 가장 큰 데이터 멤버 크기이기 때문에 마지막에 패딩이있을 수 있습니까? 가장 큰 크기의 데이터가 어쨌든 경계에 정렬되어 있기 때문에 패딩을 사용하지 않는 것처럼유니온의 패딩이 존재하는지 여부
union
{
char c;
int x;
}
것 같다 내부
연합 (EU) 우리는 원시 형으로 사용할 때.
하지만 우리가 구조 내에 구조를 중첩 할 때.
union u
{
struct ss
{
char s;
int v;
}xx;
}xu;
그것은 패딩은 UNION에서 persent입니다 그래서 귀하의 질문에 대한 답변
크기 8 결과. 노동 조합의 크기부터
이 경우 이미'struct '에 패딩이 있습니다. –
Daniel은 이것이 잘못된 것이라고 제안했습니다. 오해의 소지가있는 구조체의 패딩을 참조하는 것입니다. – kadina
사실 일 필요는 없다 최대 규모의 데이터 멤버 크기
입니다. 고려하십시오
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
의 크기는 가장 큰 구성원보다 작지 않은 구성원이 요구하는 최대 정렬 중 가장 작은 배수가됩니다.
하지만 우리가 char arr [sizeof (double) +1]을 노조에 가지고있을 때 그 크기는 단지 9를 제공합니까? – Dineshkumar
이것은 표준에서 요구하는 것은 아니지만, 구현시 패딩을 추가 할 수 있지만 일반적으로 (8 바이트'double's) 예 9의 크기가됩니다. –
누구든지이 예제가 위로 패드? - 여기에 덧붙여 야 할 이유가 없다고 생각하기 때문에 물어 봅니다. 두 멤버 사이에 공간이 있어야하는 것처럼, 가장 큰 것을 선택해야합니다. – ideasman42
짧게 ** ** ** 내 Windows 시스템에서 공용 구조체는 'int'크기의 배수 인 크기로 채워져 있습니다 (예 : ** 4 바이트 **). '#pragma pack (1)'을 사용하면 크기가 3 바이트 인 공용체가 하나의 바이트로 더 채워져 4 바이트가됩니다. 프로그램을 작성하고 질문을 게시하기 전에 시도하십시오. –
"유니온은 int 크기의 배수, 즉 4 바이트 크기로 채워집니다." 이 경우 노동 조합 ab { char a; } a; 크기는 1 – akash
귀하의 경우에는 전혀 패딩이 없습니다. 누가 항상 '패딩'을했다고 했습니까? 다니엘 피셔 (Daniel Fischer)와 마찬가지로, 표준에 따라 ** 위임되지 않았습니다 **. –