Derleyiciler, yazdığımız yüksek seviyeli kodları bilgisayarların veya mikroişlemcilerin rahatça çalıştırabilmesi için makine kodlarına dönüştürmeye yarayan, bu dönüşüm işlemi esnasında da çeşitli optimizasyon işlemleri sayesinde sistemden maksimum verim elde etmeyi amaçlayan araçlardır. Arkaplanda çalışan sistemleri karışık olduğu için genelde es geçilir ancak derleyicilerin bize sağladığı optimizasyon seviyeleri kadar bizim de yapmamız gereken bazı optimizasyon işlemleri vardır. Bu yazı serisinde derleyicinin otomatik olarak yaptığı optimizasyonlardan ve geliştiricinin yapabileceği optimizasyonlardan bahsediyor olacağım.

Geliştirici gözüyle bakıldığı zaman derleyiciler tüm işlemleri otomatik olarak yapıyor olarak görünür. Örneğin; GCC derleyicisinde derleme işlemi sırasında kullanabileceğiniz optimizasyon flag’leri (bazı kelimelerin direkt Türkçe çevirisinin anlamlı olmayacağını düşündüğüm için İngilizce karşılığını kullanmayı tercih ediyorum.) vardır. Onlar sayesinde kodunuzu hangi seviyede optimize etmek istediğinizi ayarlayabilirsiniz. Her zaman maksimum optimizasyon flag’ini kullanmak işinize yaramayabilir, bu konu hakkında detaylı bilgi için derleyicinin dokümantasyon sayfasını kullanabilirsiniz. Her ne kadar derleyiciler kendi içlerinde bazı optimizasyon işlemlerini yapsalar da proje büyüdükçe kod boyutu ve karmaşıklığı arttığı için bazı noktalarda derleyicinin kararsız kalmasını engellemek adına ve derleme zamanından tasarruf etmek için gereksiz işlem yapmasını engellemek adına kod içerisine bazı ekleme ve çıkartmalar yapmamız gerekebilir.

Bu yazımızın konusu da Modern C++ kavramıyla gelen noexcept ifadesi olacak.

noexcept

noexcept ifadesi C++11 ile birlikte dile kazandırılan bir ifadedir ve kullanıldığı fonksiyonun herhangi bir exception atmayacağı bildirilirse true döndüren bir compile-time denetimi gerçekleştirir.

Peki bu ne anlama geliyor? Yazılım tasarımında “exception safety guarantee” denilen method temel alınır;

1) Basic Guarantee
2) Strong Guarantee
3) Nothrow Guarentee

Yazacağımız kod ne olacak ise minimum olarak “Basic Guarantee” sağlanması gerekiyor. Ancak “Nothrow Guarantee” sağlandığı durumlarda derleyiciye bunu belirtmekte fayda var. Kod yazılırken noexcept kullanılmaması durumunda derleyici kodda oluşabilecek expection’ları da tahmin etmek için bir vakit ve kaynak harcıyor. Kullanıldığı zaman ise derleyiciye otomatik olarak “Nothrow” sağlandığını bildiriyoruz. Büyük boyutlu projelerde bu ciddi bir zaman kaybı oluşturuyor. Şu an içerisinde bulunduğum projede bunun derleme süresindeki faydasını gözle görebiliyoruz. Oluşturduğunuz fonksiyonlarda herhangi bir exception atılmayacağına eminseniz fonksiyona noexcept ifadesini eklerseniz derleyici bu kontrolü yapmadan geçecektir ve bu sayede zaman ve kaynak tasarrufu sağlanacaktır. Ancak kullanırken dikkatli olmak gerekiyor, çünkü fonksiyonun exception atmayacağından emin olmadan yapıldığı taktirde run-time’da problemlere yol açacaktır.

Örnek kullanım:

void no_throw() noexcept;

Daha fazla bilgi için: C++ Reference | Noexcept

Yazı içerisindeki düzeltmeler ve eklemeler için Serbay Özkan‘a teşekkür ederim.

Author

Genel dünya problemleri ile çok ilgili olmasa da teknolojik gelişmeleri yakından takip eden, sistemleri geliştirmek için çalışmalar yapan, bolca kod yazmaya çalışan ve öğrendiklerini paylaşmaya çalışan birisi.

Write A Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.