Como usar Unions em C++ ?

Economizar espaço na memória nunca é demais! 😃


Como usar Unions em C++ ?


O que é uma Union?

Um union é parecida com uma struct, a diferença é que a Union reaproveita o espaço para o próximo tipo dado dentro dela, já a Struct adiciona à um novo bloco.

Declaração de uma Union:

union Nome {
  // conteúdo
};

Ela também é similar às classes, mas além da diferença de reaproveitamento, assim como as Structs, a Union não precisa de public para acessar os dados, já nas classes se você não informar serão private por padrão.


Exemplos

Vamos supôr que você possui esse código que armazena dados de um determinado produto:

#include <iostream>

union Produto {
  int id;
  double value;
};

int main( int argc , char **argv ){
  Produto p;
  p.id = 9;
  std::cout << p.id << '\n';
  return 0;
}


Se você compilar o código acima, perceba que a saída será justamente o id que atribuímos: 9 .

Mas agora vamos também atribuir dado para o value e imprimir:

#include <iostream>

union Produto {
  int id;
  double value;
};

int main( int argc , char **argv ){
  Produto p;
  p.id = 9;
  p.value = 1.542;
  std::cout << p.id << '\n';
  std::cout << p.value << '\n';
  return 0;
}

Saída:

824633721
1.542

Perceba que o value a saída foi correta, mas o id se transformou em um número estranho.

Note também que se você usar esse mesmo código com struct isso não ocorrerá, exemplo:

#include <iostream>

struct Produto { // alteramos para struct
  int id;
  double value;
};

int main( int argc , char **argv ){
  Produto p;
  p.id = 9;
  p.value = 1.542;
  std::cout << p.id << '\n';
  std::cout << p.value << '\n';
  return 0;
}

Saída:

9
1.542

Por quê ???

Como havía dito o union reaproveita o espaço, ou seja, o int(4 bytes) é menor que o double(8 bytes), logo, aquele espaço reaproveitado vira um Lixo de Memória .

Vamos ilustar somente por fins didáticos:


Em um union o espaço do int é reaproveitado e ele escreve o double: Union


Já numa struct ele mantém aquele espaço do int e cria um novo para o double Struct


Se você inverter as ordens de definição isso não ocorrerá porque o int é menor que o double .

Unions foram criados justamente para economizar espaço na memória, mas os programadores obtiveram um vício de escrita e usam mais comumente as Structs.

No então, em código de alguns programadores que se preocupam muito com otimização você encontrará mais Unions que Structs .

Quer aprender C++? Então, acesse: https://terminalroot.com.br/cpp .


Links Úteis


cpp cppdaily


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!