Sık Yapılan Hatalar: auto Anahtar Sözcüğünü Yanlış Kullanma
autoC++11'den beri derleyicinin türü otomatik çıkarmasını sağlıyor. Pratik görünse de yanlış kullanılınca ciddi sorunlar çıkıyor. En sık hatalardan bahsedelim.
En tehlikeli hata: auto kullanınca referans & kayboluyor. Veri kopyalanıyor, orijinal değişken değişmiyor.
1std::vector<int> vec = {1, 2, 3};23// YANLIŞ: kopya oluşur4for (auto x: vec) {5x = 100; // vec değişmez!6}78// DOĞRU: referans tutar9for (auto& x: vec) {10x = 100; // vec değişir11}1213std::cout << vec[0]; // 100 yazılırÇıktı: 100
Eğer değişiklik yapmayacaksan const auto& kullan (performans + güvenlik).
Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
const autoyazmazsanız, const nesneyi değiştirilebilir sanıyor derleyici.
1const std::string str = "sabit";23// YANLIŞ: derleyici uyarı verir4auto s = str; // kopya, const değil56// DOĞRU7const auto& s = str; // orijinal, constauto ile auto arasındaki fark kritik. Biri pointer, diğeri kopya.
1int arr[] = {1, 2, 3};2int* ptr = arr;34// YANLIŞ: kopya pointer5auto p1 = ptr; // int*67// Konteyner içinde YANLIŞ8std::vector<int*> ptrs = {&arr[0], &arr[1]};9for (auto p: ptrs) {10delete p; // hata! dinamik değil11}1213// DOĞRU: referans pointer14for (auto* p: ptrs) {15// p artık int*, güvenli16}Bazen auto beklediğiniz türü değil, başka bir türü çıkarıyor.
1std::map<std::string, int> m = {{"a", 1}};23// YANLIŞ: std::pair<const std::string, int> kopya4auto item = *m.begin();56// DOĞRU: referans tutar7auto& item = *m.begin();8item.second = 2; // harita değişir- Değiştireceksen:
auto& - Sadece okuyacaksan:
const auto&(en hızlı) - Pointer işlemiyorsan:
autoveyaauto - Şüpheleniyorsan:**
autoyerine açık tür yaz
bknz: Defer Anahtar Sözcüğü: Kaynakları Güvenli Serbest Bırakma
5 yorum
haklısın bir kere vector ya da string gibi şeyleri kopyalamaya başlayınca işlemci bayağı uğraşıyor
ya özellikle büyük objelerle çalışırken fark çok belli oluyor bir kere kopyalanmamışsa
evet const auto& kullanmaya başladıktan sonra hız farkını kendim de gördüm özellikle
kopya yerine referans kullanınca performans da düşüyor aslında hem veri hem de hız kaybı yaşıyorsun
aslında auto& ile auto arasındaki fark fark ettim referans kaybı gerçekten rahatsız edici