Estoy confundido acerca de esta declaración del libro de óxido:

Hay otra ventaja para usar un enumante en lugar de una estructura: cada variante puede tener diferentes tipos y cantidades de datos asociados. Versión Cuatro direcciones IP de IP siempre tendrán cuatro componentes numéricos que tendrán valores entre 0 y 255. Si queríamos almacenar direcciones V4 como cuatro valores u8, pero siguen expresando las direcciones V6 como un valor String, nosotros no sería capaz de con una estructura . Los enumers manejan este caso con facilidad:

#![allow(unused_variables)]
fn main() {
    enum IpAddr {
        V4(u8, u8, u8, u8),
        V6(String),
    }

    let home = IpAddr::V4(127, 0, 0, 1);

    let loopback = IpAddr::V6(String::from("::1"));
}

Pero cuando lo intenté con structs para almacenar direcciones V4 como cuatro valores u8, pero siguen expresando las direcciones V6 como un valor String también está haciendo lo mismo sin errores.

#[derive(Debug)]
struct IpAddr {
    V4:(u8, u8, u8, u8),
    V6:String,
}

fn main () {
    let home = IpAddr {
        V4: (127, 1, 1, 1), 
        V6: String::from("Hello"),
    };
    println!("{:#?}", home);      
}
-1
Muhammad Areeb Siddiqui 1 jul. 2019 a las 08:14

1 respuesta

La mejor respuesta

No es lo mismo. ¡Todos los elementos de Enum tienen el mismo tamaño! El tamaño de un elemento enumio es el tamaño de la variante más grande más el identificador de variante.

Con una estructura es un poco diferente. Si ignoramos el relleno, el tamaño de la estructura es la suma de los tamaños de sus miembros. Con relleno será un poco más:

fn main() {
    let size = std::mem::size_of::<TheEnum>();
    println!("Enum: {}", size * 8);

    let size = std::mem::size_of::<TheStruct>();
    println!("Struct: {}", size * 8);
}

struct TheStruct {
    a: u64,
    b: u8,
    c: u64
}

enum TheEnum {
    A(u64),
    B(u8),
    C(u64)
}

Aquí podemos ver la diferencia:

  • Enumio: 128; 64 Para la variante más grande y 64 para el identificador de variante.

  • Structura: 192; alineado a 64 bits, por lo que tenemos 54 bits de relleno

Otra diferencia está en la forma en que usas enumias y estructuras. En un enumio, tienes que inicializar solo una de las variantes. En su caso, ya sea IPv4 o IPv6. Con una estructura, ya que en su ejemplo, usted tiene que proporcionar la dirección V4 y V6. No puede proporcionar solo V4 o solo V6.

1
Svetlin Zarev 1 jul. 2019 a las 05:39