ProgramlamaBackend Geliştirici

Rust'ta sabitler ve statik değişkenlerin ne olduğunu, bunların farklarını ve her birinin hangi durumlarda tercih edileceğini açıklayın.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Rust'ta program çalıştırılırken değişmeyen verileri saklamak için iki ana yol vardır: const ve static.

Sabit (const) — derleme zamanı sırasında hesaplanan değişmez bir değerdir. Her zaman açıkça tiplenmiş olmalıdır ve bir sabit ifade ile başlatılmalıdır (bu ifade derleme zamanında hesaplanabilir). Sabitlerin bellek içinde sabit bir adresi yoktur ve derleyici tarafından kullanıldığı yerlere "eklenir".

const MAX_ATTEMPTS: u32 = 5;

Statik değişken (static) bir değeri programın tamamı boyunca belirli bir bellek alanında saklar. Adresi sabittir ve değiştirilebilir ( static mut kullanılarak), ancak çoklu iş parçacıklı senaryolar nedeniyle erişirken özel önlemler alınması gerekmektedir.

static APP_NAME: &str = "MyApp"; static mut COUNTER: u32 = 0;
  • const kullanın, eğer değer her zaman derleme zamanında bilinmeli ve genel bir depolama alanına gerek yoksa.
  • static kullanın, eğer bellek içinde herkesin erişebileceği tek bir depolama yeri gerekiyorsa veya değer derleme aşamasında hesaplanamıyorsa.

Çelişkili Soru

Rust'ta const ile static arasındaki fark nedir? Statik bir değişken bir sabit olmayan bir değere referans verebilir mi?

Cevap: Temel fark — bellek içindeki saklama alanıdır (ömür): const bellek içinde var olma garantisi vermez (bu, değer yerleştirmesidir), static ise program boyunca sabit bir adrese sahip olan bir nesnedir.

Statik bir değişkene yalnızca derleme zamanında bilinen bir değer atanabilir:

let a = 42; // static INVALID: i32 = a; // Hata! Sadece sabitler geçerlidir.

Gerçek Hatalardan Örnekler


Hikaye

Bir yüksek erişilebilirlik backend servis projesinde, geliştiricilerden biri farklı iş parçacıklarından gelen istekler için ortak bir sayıcı olarak static mut kullandı, senkronizasyon kullanmadı. Bu, veri yarışmalarına ve öngörülemeyen sonuçlara yol açtı — bazı istekler kayboldu. Çözüm — std::sync::atomic içindeki atomik tipleri veya Mutex kullanmaktır.


Hikaye

Genç bir geliştirici kullanıcı selamlamasını const ile bir sabite taşımaya karar verdi, ancak bunu başlatma sırasında hesaplanan bir işlemin sonucu ile ilişkilendirmeye çalıştı. Derleyici hata verdi çünkü değer derleme aşamasında tanımlanmalıydı. Sebep — sabit, derleme zamanında hesaplanabilir olmalıdır, oysa işlev bir değer döndürürken çalıştırma sırasında hesaplanır.


Hikaye

Eski bir projede, tüm küresel değerler static ile değiştirildi, ancak dize literallerinin referanslarının programın bellek alanından yararlandığını unuttular; bazı bildirimler yalnızca değer yerleştirmesi gerektiriyordu: bu, ikili dosyanın boyutunu artırdı ve bellek yönetimini karmaşıklaştırdı. Sonuç — başlangıç süresinde artış ve dinamik kütüphanelerin yüklenmesi sırasında bellek sızıntıları.