Introdução à união em C++

apresentação sindical

  Uma união, também chamada de união, pode definir uma variedade de tipos de dados diferentes em uma "união", e uma variável descrita como o tipo da "união" pode carregar quaisquer dados definidos pela "união", esses os dados compartilham a mesma memória para atingir o objetivo de economizar espaço. O comprimento de memória ocupado pela variável de união é igual ao comprimento de memória do membro mais longo.

Comparação de união e estrutura

Vejamos um exemplo sobre struct:

struct aluno 
{ 
     caracter marca; 
     num longo; 
     pontuação flutuante; 
};

A estrutura de memória de sua struct é a seguinte, e o valor de sizeof(struct student) é de 12 bytes.

Seguem exemplos de sindicatos:

teste de união 
{ 
     marca de caracteres; 
     num longo; 
     pontuação flutuante; 
};

O valor de sizeof(teste de união) é 4. Porque a união armazena uma marca do tipo char, uma variável num do tipo long e uma variável score do tipo float na unidade de memória a partir do mesmo endereço , e o número de bytes de memória ocupados pelo tipo char e pelo tipo long é diferente Sim, mas eles são todos armazenados do mesmo endereço na união, ou seja, a tecnologia de sobreposição usada, essas três variáveis ​​sobrescrevem umas às outras, e essa estrutura que faz com que várias variáveis ​​diferentes ocupem a mesma memória é chamada de estrutura do tipo "corpo compartilhado". A estrutura do seu tipo de união é a seguinte:

Como os endereços iniciais de todos os membros da união são os mesmos, os valores de &a.mark, &a.num e &a.score são todos iguais.

não pode ser usado da seguinte forma:

teste de união a; 
printf("%d", a); //erro

Como existem vários tipos de áreas de armazenamento de a, que ocupam áreas de armazenamento de diferentes comprimentos, apenas o nome da variável de união a é escrito, de modo que o compilador não pode determinar o valor de qual membro gerar.

printf("%d", a.mark); //Corrigir

testar endianidade

Um uso da união é testar se a CPU está no modo big-endian ou no modo little-endian:

#include <iostream> 
usando namespace std; 

void checkCPU() 
{ 
    union MyUnion{ 
        int a; 
        caractere c; 
    }teste; 
    teste.a = 1; 
    if (test.c == 1) 
        cout << "little endian" <<endl; 
    else cout << "big endian" <<endl; 
} 

int main() 
{ 
    checkCPU(); 
    retorna 0; 
}

Por exemplo, o código é o seguinte:

#include <iostream> 
using namespace std; 

union test 
{ 
     char mark; 
     long num; 
     float score; 
}a; 

int main() 
{ 
     // cout<<a<<endl; // errado 
     a.mark = 'b'; 
     cout<<a.mark<<endl; // saída 'b' 
     cout<<a.num<<endl; // valor ASCII de 98 caracteres 'b' 
     cout<<a.score<<endl; // erro de saída Valor 

     a.num = 10; 
     cout<<a.mark<<endl; // quebra de linha de saída, obrigado suxin por sua correção 
     cout<<a.num<<endl; // saída 10 
     cout<<a.score< <endl ; // valor de erro de saída 

     a.score = 10.0; 
     cout<<a.mark<<endl; // saída vazia 
     cout<<a.num<<endl; // saída do valor de erro 
     cout<<a.score<<endl; // saída 10

     retorna 0; 
}

União em C++

As regras de uso de união resumidas acima ainda se aplicam em C++. E se o objeto for adicionado?

#include <iostream> 
usando namespace std; 

classe CA 
{ 
     int m_a; 
}; 

teste de união 
{ 
     CA a; 
     d duplo; 
}; 

int main() 
{ 
     return 0; 
}

O código acima é executado sem problemas.

Se você adicionar um construtor ou um destruidor  à classe CA , descobrirá que o programa dará errado. Como as coisas na união compartilham memória, variáveis ​​estáticas e de tipo de referência não podem ser definidas. Porque os objetos de classes com construtores, destruidores e construtores de cópia não podem ser armazenados em união, mas os ponteiros de objeto de classe correspondentes podem ser armazenados. O compilador não pode garantir que o construtor e o destruidor da classe sejam chamados corretamente, portanto, podem ocorrer vazamentos de memória. Portanto, ao usar union em C++, tente manter o estilo de usar union na linguagem C, e tente não deixar que union tenha objetos.

Acho que você gosta

Origin blog.csdn.net/std7879/article/details/125001689
Recomendado
Clasificación