ProgramlamaGömülü C geliştirici

C dilinde 'register' ve 'auto' depolama spesifikasyonları hakkında neler biliyorsunuz? Gerçek rolü nedir, modern kodda kullanmanın bir anlamı var mı ve yanlış kullanılmaları durumunda hangi hatalar oluşabilir?

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

Cevap

auto ve register, C dilindeki değişkenlerin depolama spesifikasyonlarıdır.

  • auto, tarihsel olarak bir fonksiyondaki/bloktaki yerel değişkenleri temsil eder. Varsayılan olarak tüm yerel değişkenler auto'dur, bu yüzden bunu açıkça yazmanın genelde bir anlamı yoktur.

  • register, derleyiciden değişkeni işlemci kayıtlarında depolamasını istemektedir, böylece erişim hızlanır. Ancak modern derleyiciler depolamayı kendiliğinden optimize eder ve bu isteğe ya yanıt vermez ya da en azından dikkate alır.

Ayrıca register türündeki değişkenler adres alamaz (&var yasaktır).

Örnek:

register int counter = 0; auto float sum = 0.0f;

Kandırmaca Soru

Register-değişken üzerinde bir işaretçi tanımlanabilir mi? Örneğin:

register int x = 5; int *p = &x;

Cevap:

Hayır, register-değişkenin adresini almak mümkün değildir - bu bir derleme hatası olacaktır. Register spesifikasyonu, bir değişkenin adres alma işlemini yasaklar.

Konu loshlarını bilmemenin gerçek hata örnekleri


Hikaye

Eski bir projede, geliştirici döngü değişkenleri için register kullandı ve ardından bunların adresini bir fonksiyona geçirmeye çalıştı: foo(&i);. Kod derlenmedi ve register spesifikasyonunu kaldırması gerektiğini söyledi. Hata yalnızca derleme sırasında keşfedildi ve refaktörizasyon gecikti.


Hikaye

Ekip, büyük boyutlu bir değişken (örneğin, yapı) için register kullanmaya çalıştı. Derleyici isteği göz ardı etti ve değişkeni bellekte depoladı, bu da beklenen performans artışını sağlamadı ve geliştiriciler uzun süre yavaşlama nedenini aradı.


Hikaye

Koda, diğer dillere yönelik olarak auto kullanarak yerel değişkenler için yaygın bir kullanım sağlandı, bu da kodu karıştırdı, davranışı etkilemedi, okunmasını zorlaştırdı ve meslektaşlarda şüpheler oluşturdu.