In Rust zijn er twee hoofdmanieren om onveranderlijke gegevens op te slaan gedurende de uitvoering van een programma: const en static.
Constante (const) is een onveranderlijke waarde die tijdens de compilatie wordt berekend. Deze moet altijd expliciet getypeerd zijn en geïnitieerd worden met een constante expressie (die tijdens de compilatie kan worden berekend). Constanten hebben geen vast adres in het geheugen en worden door de compiler 'ingebracht' op de plaatsen waar ze worden gebruikt.
const MAX_ATTEMPTS: u32 = 5;
Statische variabele (static) slaat een waarde op in een bepaald geheugengebied gedurende de hele uitvoering van het programma. Het adres ervan is vast, en deze kan veranderlijk zijn (met behulp van static mut), maar toegang tot deze vereist speciale voorzichtigheid vanwege mogelijke gegevensraces in multithread-scenario's.
static APP_NAME: &str = "MyApp"; static mut COUNTER: u32 = 0;
const wanneer de waarde altijd bekend moet zijn op compile-tijd en geen wereldwijde opslag vereist is.static als er een enkele opslagplaats in het geheugen nodig is, waartoe alle modules toegang hebben, of als de waarde niet tijdens de compilatie kan worden berekend.Wat is het verschil tussen
constenstaticin Rust? Kan een statische variabele verwijzen naar een niet-constante?
Antwoord: Het belangrijkste verschil is het opslaggebied (lifetime): const garandeert niet dat het in het geheugen bestaat (dit is een vervangingswaarde), terwijl static een object is dat gedurende de hele programma-uitvoering bestaat met een vast adres.
Aan een statische variabele kan alleen een waarde worden toegewezen die bekend is op het moment van compilatie:
let a = 42; // static INVALID: i32 = a; // Fout! Alleen constanten zijn toegestaan.
Verhaal
In een backend-serviceproject voor load balancing gebruikte een van de ontwikkelaars static mut voor een gedeelde teller van verzoeken uit verschillende threads, zonder synchronisatie te gebruiken. Dit leidde tot gegevensraces en onvoorspelbare resultaten — een deel van de verzoeken ging simpelweg verloren. Oplossing — gebruik atomische types uit std::sync::atomic of Mutex.
Verhaal
Een jonge ontwikkelaar besloot de begroeting van de gebruiker in een constante te zetten met const, maar probeerde deze te koppelen aan het resultaat van een functie die tijdens de initialisatie werd berekend. De compiler gaf een foutmelding omdat de waarde gedefinieerd moest zijn op compile-tijd. De reden — een constante moet berekenbaar zijn op compile-tijd, terwijl de functie een waarde tijdens de uitvoering retourneert.
Verhaal
In een oud project werden alle globale waarden vervangen door static, waarbij werd vergeten dat stringliteralen met referenties het geheugen van het programma gebruiken, en sommige declaraties in feite alleen de vervangingswaarde vereisten: dit vergrootte de binaire grootte en bemoeilijkte het geheugenbeheer. Het resultaat — een toename van de opstarttijd en lekkages bij dynamische laadt van bibliotheken.