C struct v union en la programación integrada, ¿por qué? [cerrado]

0

¿Hay algo que una unión pueda hacer que una estructura no pueda?

Sé que uno podría usar una unión para ahorrar espacio en la memoria, pero en estos días no importa.

    
pregunta Dirk Bruere

4 respuestas

6

El uso de un UNION permite formatear una asignación de almacenamiento particular para diferentes tipos de variables o diseños. Esto se puede utilizar para obtener ventajas de varias maneras. Aquí hay un par de ejemplos.

  1. Tiene una UNION que define los distintos diseños de registro para paquetes de datos que llegan desde un canal de comunicación.
  2. Puede usar UNION para desempaquetar de manera eficiente los datos de un tipo de variable a otro, como superponer un "uint_32" con un "uint_8 [4]" para desempacar bytes de un dword.
respondido por el Michael Karas
5

La diferencia entre una Unión y una estructura ya ha sido explicada.

Si sabe que solo hay un valor (que puede tener diferentes tipos) que usar una unión. opcionalmente, necesita otra variable que haga un seguimiento del tipo de unión. Me gusta:

union 
{
   uint8_t value_8;
   uint16_t value_16;
   uint32_t value_32;
};

enum EUnionType { VALUE_8, VALUE_16, VALUE_36 } _unionType;

La enumeración _unionType se puede establecer en VALOR_8 / 16/32 para indicar qué tipo tiene la unión.

Acerca de la memoria: la memoria ES importante, especialmente para algunos microcontroladores que tienen menos memoria (por ejemplo, Arduino Uno con 2 KB). Y si tienes 400 de estas uniones (en una matriz) es una diferencia:

  • Struct: 4 + 2 + 1 bytes = 7 bytes, por elemento. Tiempos 400 = 2,800 bytes - > No cabe en la memoria.
  • Unión: 4 bytes * 400 = 1,600 bytes - > Se ajusta a la memoria.
respondido por el Michel Keijzers
3

Dentro de una unión, cada elemento se almacena en la misma ubicación de memoria, por ejemplo,

union{
  uint32_t a;
  uint8_t b[4];
}

Si modifica b [], también modifica a, porque están usando la misma dirección física. Es conveniente, si tiene datos de uso como tipos diferentes.

Dentro de las estructuras, cada elemento se coloca uno tras otro con diferentes direcciones.

    
respondido por el Alexander von Wernherr
3

Como ya se describió, Union es un tipo de cadena de caracteres predefinida, donde todos los elementos compartirán el mismo espacio de memoria, por lo que es muy útil para realizar la serialización y deserialización de datos (siempre que ambos sistemas compartan la misma endianidad)

Como ejemplo:

Para acceder al segundo byte de un int de 32 bits usando union:

#include  <stdio.h>
#include <stdint.h>

int main(void)
{
    union{
      uint32_t a;
      uint8_t b[4];
    } test;
    test.a = 0xAABBCCDD;
    printf("Hello, world! %x\n", test.a);
    printf("Hello, world! %x\n", test.b[1]);
    return 0;
}

Lo mismo podría hacerse con un tipo de conversión:

#include  <stdio.h>
#include <stdint.h>

int main(void)
{
    uint32_t test = 0xAABBCCDD;
    printf("Hello, world! %x\n", test);
    printf("Hello, world! %x\n", ((uint8_t*)&test)[1]);
    return 0;
}

La diferencia es que la unión ya "empaquetó" el acceso para usted, lo que le permite acceder a los mismos datos de una forma "más clara".

    
respondido por el Gustavo Laureano

Lea otras preguntas en las etiquetas