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.