수색…
struct와 union의 차이점
이는 조합 멤버가 메모리를 공유하고 구조체 멤버가 메모리를 공유하지 않는다는 것을 보여줍니다.
#include <stdio.h>
#include <string.h>
union My_Union
{
int variable_1;
int variable_2;
};
struct My_Struct
{
int variable_1;
int variable_2;
};
int main (void)
{
union My_Union u;
struct My_Struct s;
u.variable_1 = 1;
u.variable_2 = 2;
s.variable_1 = 1;
s.variable_2 = 2;
printf ("u.variable_1: %i\n", u.variable_1);
printf ("u.variable_2: %i\n", u.variable_2);
printf ("s.variable_1: %i\n", s.variable_1);
printf ("s.variable_2: %i\n", s.variable_2);
printf ("sizeof (union My_Union): %i\n", sizeof (union My_Union));
printf ("sizeof (struct My_Struct): %i\n", sizeof (struct My_Struct));
return 0;
}
공용체를 사용하여 값 재 해석
일부 C 구현에서는 코드가 유니온 형식의 한 멤버에 쓰고 다른 형식에서 읽은 후 일종의 재 해석 캐스트 (이전 형식의 비트 표현으로 새 형식 구문 분석)를 수행 할 수 있습니다.
그러나 이것은 C의 표준 현재 또는 과거에 의해 허용되지 않으며 컴파일러가 제공하는 매우 일반적인 확장 기능이 없기 때문에 정의되지 않은 동작을 초래할 것입니다 (따라서 컴파일러 문서를 확인하십시오) .
이 기술의 실제 사례 중 하나는 부동 소수점 연산을 사용하는 것보다 역 제곱근을 더 빨리 수행하기 위해 IEEE 754 부동 소수점 숫자의 구현 세부 사항에 의존하는 "Fast Inverse Square Root"알고리즘입니다.이 알고리즘은 포인터 캐스팅 (매우 위험하고 엄격한 앨리어싱 규칙을 어기는) 또는 union을 통해 (아직 정의되지 않은 동작이지만 많은 컴파일러에서 작동합니다).
union floatToInt
{
int32_t intMember;
float floatMember; /* Float must be 32 bits IEEE 754 for this to work */
};
float inverseSquareRoot(float input)
{
union floatToInt x;
int32_t i;
float f;
x.floatMember = input; /* Assign to the float member */
i = x.intMember; /* Read back from the integer member */
i = 0x5f3759df - (i >> 1);
x.intMember = i; /* Assign to the integer member */
f = x.floatMember; /* Read back from the float member */
f = f * (1.5f - input * 0.5f * f * f);
return f * (1.5f - input * 0.5f * f * f);
}
이 기술은 부동 소수점 연산 사용에 비해 속도가 빠르기 때문에 과거 컴퓨터 그래픽 및 게임에서 널리 사용되어 왔으며 속도에 대한 대가로 일부 정확성을 잃어 버리고 매우 휴대 성이 떨어지는 절충안입니다.
한 노조원에게 글쓰기와 다른 글 읽기
노동 조합의 구성원은 동일한 공간을 공유합니다. 즉, 한 구성원에게 쓰기는 다른 모든 구성원의 데이터를 덮어 쓰며 한 구성원의 읽기는 다른 모든 구성원의 읽기와 동일한 데이터가됩니다. 그러나 조합원이 서로 다른 유형과 크기를 가질 수 있기 때문에 읽은 데이터는 다르게 해석 될 수 있습니다. http://www.riptutorial.com/c/example/9399/using-unions-to-reinterpret-values를 참조하십시오 .
아래의 간단한 예제는 동일한 유형의 두 멤버가 결합 된 유니온을 보여줍니다. 이 부재에 기록하는 것을 나타낸다 m_1
기록 값의 결과가 부재로부터 판독되는 m_2
및 부재에 기록 m_2
기록 값을 초래하는 것은 부재로부터 판독되는 m_1
.
#include <stdio.h>
union my_union /* Define union */
{
int m_1;
int m_2;
};
int main (void)
{
union my_union u; /* Declare union */
u.m_1 = 1; /* Write to m_1 */
printf("u.m_2: %i\n", u.m_2); /* Read from m_2 */
u.m_2 = 2; /* Write to m_2 */
printf("u.m_1: %i\n", u.m_1); /* Read from m_1 */
return 0;
}
결과
u.m_2: 1
u.m_1: 2