Variables Estáticas y Constantes

Las variables estáticas y constantes son dos formas diferentes de crear valores de ámbito global que no se pueden mover ni reasignar durante la ejecución del programa.

const

Las variables constantes se evalúan en tiempo de compilación y sus valores se insertan dondequiera que se utilicen:

const DIGEST_SIZE: usize = 3;
const ZERO: Option<u8> = Some(42);

fn compute_digest(text: &str) -> [u8; DIGEST_SIZE] {
    let mut digest = [ZERO.unwrap_or(0); DIGEST_SIZE];
    for (idx, &b) in text.as_bytes().iter().enumerate() {
        digest[idx % DIGEST_SIZE] = digest[idx % DIGEST_SIZE].wrapping_add(b);
    }
    digest
}

fn main() {
    let digest = compute_digest("Hello");
    println!("Digest: {digest:?}");
}

According to the Rust RFC Book these are inlined upon use.

Sólo se pueden llamar a las funciones marcadas como const en tiempo de compilación para generar valores const. Sin embargo, las funciones const se pueden llamar en runtime.

static

Las variables estáticas vivirán durante toda la ejecución del programa y, por lo tanto, no se moverán:

static BANNER: &str = "Welcome to RustOS 3.14";

fn main() {
    println!("{BANNER}");
}

Tal y como se indica en el libro Rust RFC Book, no están insertadas y tienen una ubicación de memoria real asociada. Esto resulta útil para código insertado y no seguro. Además, la variable continúa durante toda la ejecución del programa. Cuando un valor de ámbito global no tiene ningún motivo para necesitar identidad de objeto, se suele preferir const.

Dado que se puede acceder a las variables static desde cualquier hilo, es necesario protegerlas, por ejemplo, mediante un comando Mutex, o que sean accesibles usando código unsafe. Veremos la mutación de datos estáticos en el capítulo sobre Rust inseguro.

  • Menciona que const se comporta semánticamente de forma similar a constexpr de C++.
  • Por su parte, static se parece mucho más a const o a una variable global mutable de C++.
  • static proporciona la identidad del objeto: una dirección en la memoria y en el estado que requieren los tipos con mutabilidad interior, como Mutex<T>.
  • No es muy habitual que se necesite una constante evaluada en runtime, pero es útil y más seguro que usar una estática.
  • Datos del thread_local se pueden crear con la macro std::thread_local.

Tabla de Propiedades:

PropiedadEstáticoConstante
Tiene una dirección en la memoriaNo (insertado)
Vive durante toda la ejecución del programaNo
Puede ser mutableSí (inseguro)No
Evaluado en tiempo de compilaciónSí (inicializado en tiempo de compilación)
Insertado dondequiera que se utiliceNo