No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Uniones y Enumeraciones en C++: Gestión Eficiente de Memoria

6/16
Recursos

¿Cómo funcionan las uniones en C++?

Las uniones son estructuras especiales en C++ que permiten almacenar diferentes tipos de valores en el mismo espacio de memoria, pero solo pueden mantener uno de esos valores a la vez. Esta característica es especialmente útil para gestionar eficientemente el uso de memoria, lo cual es fundamental cuando se desarrollan aplicaciones donde los recursos son limitados.

A continuación, mostraré un ejemplo de uso de uniones:

#include <iostream>
using namespace std;

union NumeroLetra {
    int numero;
    char letra;
};

int main() {
    NumeroLetra x;
    x.letra = 'a';

    cout << "Como número: " << x.numero << endl;
    cout << "Como letra: " << x.letra << endl;

    return 0;
}

¿Cómo se interpreta la salida de las uniones?

Cuando se imprime el valor almacenado en una unión en el ejemplo anterior, la letra 'a', al invocarla como número, se imprimirá su equivalente en código ASCII, que es el número 97. Esto sucede porque el mismo espacio de memoria es compartido entre ambas variables de la unión. Al tratar de leerlo como un número, el valor se interpreta según el sistema de codificación numérico ASCII.

¿Cómo demostrar diferentes interpretaciones?

Podemos forzar las conversiones de tipo para ilustrar la flexibilidad de las uniones:

  • Convertir de carácter a número:
cout << "Como entero: " << static_cast<int>(x.letra) << endl;
  • Convertir de número a carácter:
x.numero = 65;
cout << "Como letra: " << static_cast<char>(x.numero) << endl;

¿Qué son las enumeraciones?

Las enumeraciones en C++ proporcionan una manera práctica de mantener una lista de valores constantes que pueden compartirse en un mismo espacio de memoria. A diferencia de las uniones, ayudan a representar estados o categorías bien definidas, como los días de la semana.

¿Cómo declarar una enumeración?

Para declarar una enumeración, se utiliza la palabra clave enum. Aquí un ejemplo de cómo representar días de la semana:

#include <iostream>

enum DiasSemana { lunes, martes, miércoles, jueves, viernes };

int main() {
    DiasSemana dia = martes;
    std::cout << "Día almacenado: " << dia << std::endl; // Imprime 1
    return 0;
}

¿Cómo modificar el comportamiento por defecto de las enumeraciones?

En ocasiones, es posible que desees que las enumeraciones se representen con valores específicos, como caracteres. A continuación, se muestra cómo hacerlo:

enum DiasSemana { lunes = 'L', martes = 'M', miércoles = 'X' };

DiasSemana dia = martes;
printf("Día almacenado: %c\n", dia); // Imprime M

En este caso, cada día es representado con una letra diferente, aplicada manualmente para lograr un tipo de representación más lógica y comprensible.

¿Cuándo se deben utilizar uniones y enumeraciones?

Las uniones y enumeraciones son técnicas valiosas para optimizar el uso de memoria, especialmente en:

  • Aplicaciones de sistemas embebidos donde la memoria es limitada.
  • Desarrollo de software donde múltiples módulos deben compartir ciertas configuraciones constantes.

Estas estructuras permiten al programador simplificar la gestión de diferentes estados o valores compartidos, asegurando un equilibrio óptimo entre rendimiento y claridad en el código. ¡Se recomienda experimentar con ellas para ver cómo pueden facilitar tu trabajo en C++!

Aportes 7

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Los punteros parecen ser una de las cosas más complicadas que entender de C++ como lenguaje de bajo nivel.

Siempre he sido de las personas que necesita encontrar un sentido práctico a lo que aprende para poder retenerlo.

Los punteros son de gran ayuda cuando quieres pasar más de 1 parámetro entre funciones, si lo piensas bien las funciones en c++ permiten pasarle varios argumentos a una función, pero esta solo tiene 1 return.
Intenta desarrollar un programa donde utilices los punteros como medios para retornar “Sacar” más variables de un llamado a función.

Les dejo el código 😃

  • Unions:
#include <iostream>
#include <string>

using namespace std;

int main() {
  union number_letter {
    int number;
    char letter;
  };

  number_letter x = {'a'};
  number_letter y = {9};

  cout << x.letter << endl;
  cout << y.number << endl;
}
  • Enumerations:
#include <iostream>
#include <string>

using namespace std;

int main() {
  enum days_of_week { monday = 'M', tuesday = 'T', friday = 'F' };
  days_of_week day = monday;
  cout << day << endl;
}

Quería saber cuál era el uso de los “unions” y encontré esto en StakOverFlow:

The purpose of union is to save memory by using the same memory region for storing different objects at different times. That’s it.

Es decir, según esto, sirven para poder guardar varios datos de varios tipos que no se usarán a la vez y así no tener la necesidad de usar memoria extra para hacerlo. Sirve para ahorrar memoria

Aqui hago una comprobacion de como el valor de un union se reasigna si modificas una de las variables internas. Tambien hago la comprobacion de que es la misma direccion de memoria independientemente del tipo de variable que contenga que decidas consultar.
.

Mi codigo 🤯:

#include <iostream>
#include <string>

using namespace std;

int main() {

    // Union

    union number_letter {
        int number;
        char letter;
    };

    number_letter x = { 'A' };

    cout << "X as a number: " << x.number << endl;
    cout << "X as a letter: " << x.letter << endl;

    // Enums

    enum weekdays {
        monday = 'M',
        tuesday = 'T',
        wednesday = 'W',
        thursday = 'H',
        friday = 'F',
        saturday = 'S',
        sunday = 'D'
    };

    weekdays day = monday;
    cout << (char) day;

El poder de los punteros se logra entendiendo en que momento se ejecutan y como hacen uso de la memoria. Entendiendo que usar punteros es una tecnica para usar memoria en tiempo de ejecucion, todo usa memoria pero no todo te puede ser util en ejecucion, imagina que tienes una cosa como un programa con 100 funciones, que pasaria si quieres reducir el tamano en memoria, tal vez usar un arrelglo de punteros y que cada puntero apunte a una funcion. De repente tienes todas las funciones en memoria solo cuando las necesitas. Que pasa si ademas quieres usar mas de un core de tu procesador, podrias usar esos mismos punteros para usar diferentes cores y mantener control en el uso de memoria en ejecucion

los punteros sirven para referenciar valores todo el tiempo ;

aqui aunque hayamos cambiando el valor de sonata mercedes tendra el mismo valor que sonata.

cosa que si no fuera puntero , se hiviera quedado con el primer valor


class vehiculo
{
public:
	
	int numero;
};


int main()
{

	vehiculo sonata = vehiculo();
	sonata.numero = 10;
	vehiculo *Mercedes = &PadreSonata;

	PadreSonata.numero = 15;

	cout << sonata.numero << endl;
	cout << mercedes->numero;
}