C - 연합이란 무엇입니까? Union과 Struct는 매우 유사합니다. 차이점은 무엇입니까? 노동조합을 왜 만들까요? 어디에 사용해야 하나요?

C언어에는 변수라는 변수가 있는데 union, 상황에 따라 종류와 크기가 다른 객체를 저장하는 데 사용한다. 이는 구조체와 매우 유사합니다 struct. 구조체는 하나 이상의 변수 모음입니다.

union의 선언 방법은 매우 간단하며 struct다음과 같이 union의 선언 방법과 완전히 동일합니다.

union u_tag {
    
    
    int ival;
    char *sval;
} u;

보시다시피 유일한 차이점은 구조의 struct변화 입니다 union.

사용 방법은 완전히 동일합니다.

//一般变量
union_name.val
//指针
union_pointer->val

둘이 너무 비슷한데 둘의 차이점이 뭔가요? 즉, 왜 그렇게 비슷한 두 가지를 얻고 싶습니까? C는 C++가 아니며 일부 기능은 다른 그룹에서 개발했으며 일부 기능은 겹칠 것입니다.

첫 번째는 표면적인 차이로 struct사용 union목적과 완전히 다른 점으로 중괄호 안에 나열된 모든 변수를 동시에 저장 union하지 않는 것 같습니다 .struct

union u_tag {
    
    
    int a;
    int b;
} u;

int main()
{
    
    
    u.a=1;
    u.b=2;
    printf("u_tag: %d\n", u.a);
    return 0;
}

그러면 출력 결과는 다음과 같습니다.

u_tag: 2

구조와 같은 이전 출력을 union기반으로 하지 않기 때문에 결과가 잘못된 것이 아닙니다 .한 가지 유형의 데이터만 저장할 수 있으므로 후자는 원래 저장된 값을 덮어씁니다 .u.a=11u.b=2u

따라서 union내부적으로 선언된 변수는 실제 객체나 멤버 변수가 아닌 가능성으로 이해할 수 있습니다 .

그리고 union내부에 하나의 값만 있기 때문에 동일한 데이터 유형은 일반적으로 사용되지 않습니다. 현재 어떤 데이터 유형이 포함되어 있는지는 프로그래머가 프로그래밍할 때 주의해야 할 사항입니다 . 일반적으로 변수를 사용한 u_type다음 현재 포함된 유형을 판단하기 위해 판단문을 사용합니다.

그러나 핵심과는 다르며 struct탄생 의 이유는 공간을 할당하는 메커니즘입니다.unionunion

sizeof()다음 두 데이터의 크기를 측정 하면

union u_tag {
    
    
    int ival;
    float fval;
    char *sval;
} u;

struct s_tag {
    
    
    int ival;
    float fval;
    char *sval;
} s;

u_tag의 크기는 8바이트이지만 의 s_tag크기는 16바이트임을 알 수 있습니다 . 이는 union내부적으로 선언된 데이터 유형에 대해 최대 공간을 남겨두고 각 데이터 유형에 대해 고유한 공간을 남겨두는 struct것과 때문입니다.

오늘날 대부분의 컴퓨터에서 int유형은 4바이트, float유형은 4바이트, cahr *유형은 8바이트입니다. 따라서 u가장 큰 공간인 8바이트를 차지하며 s각각 고유한 공간인 4+4+8=16바이트를 갖습니다.

언제 사용해야합니까 union?
우선, 일종의 데이터를 저장하는 특성에 따라 부동 소수점 숫자와 정수 간 전환과 같은 일반적인 계산을 수행하는 데 사용할 수 있습니다.
둘째, 위의 사용 목적에 따라 공간을 절약합니다. 이 경우 구조도 사용할 수 있지만 위의 세 가지 데이터 유형이 크기의 두 배에 불과한 상황이 좋은 것으로 간주됩니다. 메모리 주소 할당 메커니즘으로 인해 일부 데이터 유형의 주소가 특별히 필요합니다. 예를 들어 일부 시스템에서는 int짝수 숫자의 주소가 필요합니다.

다음은 예시이지만 정수 주소 제한은 짝수가 아니라 4의 배수입니다.

struct s_tag {
    
    
    int ival;
    char a;
} s;

이 구조의 크기는 8바이트이며, 이 크기인지 직접 확인해 볼 수 있습니다.

그리고 컴파일러는 순차적으로 읽기 때문에 다음과 같이 작성하면

struct s_tag {
    
    
    int a;
    char b;
    int c;
    char d;
} s;

그러면 이 구조의 크기는 16바이트입니다. 이 경우 다음과 같이 동일한 유형의 데이터를 함께 작성하여 공간을 절약할 수 있습니다.

struct s_tag {
    
    
    int a;
    int c;
    char b;
    char d;
} s;

이런 식으로 이 구조가 차지하는 공간은 12바이트입니다. 그리고 사용한다면 union크기는 순서에 관계없이 항상 4바이트입니다. 데이터 유형의 가능성이 증가함에 따라 공간 절약의 필요성이 분명해집니다.

필요하신 분들께 도움이 되었으면 합니다~

Supongo que te gusta

Origin blog.csdn.net/qq_33919450/article/details/130613405
Recomendado
Clasificación