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;
Register-değişken üzerinde bir işaretçi tanımlanabilir mi? Örneğin:
register int x = 5; int *p = &x;
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.
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.