C++ constexpr

Kerim Fırat
2 min readJun 8, 2022

Modern Cpp konularını ele aldığımızda,bazı konularda Cpp tasarımcılarının isimlendirmede de yaratıcı olmadıklarını söyleyebilirim.
Ancak “constexpr” ifadesi oldukça açık ve aslında “const” ifadesinin benzeri-devamı ve/veya gelişmiş hali olduğunu ilk bakışta gösteriyor.
Kısacası “constexpr” sabit ifade anlamına gelir ve “constexpr” olarak tanımlanan bir değişkenin veya fonksiyonun,derleme zamanında(compile time) ele alınacağının garantisini verir.
Yani bu ifade ile tanımlanmış bir kod derleme zamanında çalıştırılır. Özellikle sabit bir değer üreten kodların derleme zamanında işini yapması performans açısından önemli bir kazanımdır.
Dolayısıyla template programlama kavramı ve buna bağlı olarak “constexpr” ifadesi bu yönde kullanılır.

constexpr ile const arasındaki fark ise şöyledir:
constexpr derleme zamanında ele alınır. Ancak “const” ifadesi,kendisine atanan başlangıç değerlerine bağlı olarak derleme ve çalışma zamanında(run time) ele alınabilir.

NOT: Bu ifade C++11 ile dile eklendi. Ancak sonraki sürümlerde revize edilerek yeni özellikler eklendi. Özellikle C++14 sürümünde oldukça genişletildi. C++17 ile birlikte if bloklarda kullanılabilir hale getirildi.

constexpr ifadesinin kapsamlı özelliklerine girmeden evvel,temel olarak kod örneklerine göz atalım. Aşağıda const ve constexpr ile tanımlanmış değişkenler ve bunların arasındaki kuralların örnekleri verilmiştir.

Yukarıdaki tanımlama derleme zamanında ele alınacaktır. Çünkü atanan değer bellidir ve değişmeyeceği garantidir. Ancak aşağıdaki örnek ise çalışma zamanında ele alınacaktır. Çünkü bu örnekte bir fonksiyondan geri dönüş almaktadır ve bu değer ancak çalışma zamanında sabitlik kazanacaktır.

Şimdi tekrar ilk kod örneğine dönelim. Aynı değişken bu kez “constexpr” ile tanımlanıyor ve aynı şekilde,yani const gibi derleme zamanında ele alınacaktır.

Ancak ikinci örnekte incelediğimiz kod parçasını aşağıdaki şekilde tekrar yazarsak bu kez derleme zamanı hatası alacağız.

Hata çıktısı:
error: call to non-‘constexpr’ function ‘int getSumVal(int, int)’

Bunun sebebi “constexpr” ifadesinin derleme zamanında ele alınmasıdır. Çünkü ilgili fonksiyonun döndüreceği değer ancak çalışma zamanında belirlenir. Dolayısıyla “constexpr” amacına ters düşmektedir. Bu durumda fonksiyonu da “constexpr” olarak tanımlayarak sorunu çözebiliriz.
Yani:

constexpr ile const arasındaki çekişmeler yeni başlayanlar için kafa karıştırıcı olabilir. O halde bu ikisi arasındaki kuralları aşağıdaki basit tanımlamalar üzerinden inceleyelim.

Yukarıda verilen örnekte yer alan “d” değişkeninin geçersiz olmasının sebebi,ilk değer atamasının belirsiz olmasıdır. Ancak “dd” değişkeni için bir sorun teşkil etmemektedir. Bunun sebebi ise “dd” değişkeninin bu duruma bağlı olarak çalışma zamanında ele alınacağıdır. Aşağıda verilen örnekleri inceleyelim.

Aşağıda bir diğer kafa karıştırıcı kural verilmiştir. Bu kural “void” dönüş türüne sahip fonksiyonlar için biri geçerli diğeri geçersiz durumlar oluşturmaktadır.Geçerli örnek:

Ancak aynı fonksiyona aşağıdaki gibi bir ekleme yaptığımızda GEÇERSİZ durum oluşacaktır.
Geçersiz örnek:

Geçerli ancak C++14 ve üst sürümler için. Aksi halde Geçersiz.
Dolayısıyla “- - “,”++” operatörleri bu kuralın söz konusudur.

Global değişkenleri tanımlarken kullanımı:

Bu ifadeyle ilgili dikkat etmemiz gereken bir diğer kural ise class içinde globalde kullanımıdır.

-if constexpr:

Bu kullanım genellikle template programlamada yoğun olarak kullanılmaktadır. Genel tanımlama biçimi aşağıdaki gibidir:

Bu ifadenin if ile kullanımını template programlama konuları altında ele alacağım için burada örneklere yer vermeyeceğim.

KAYNAKLAR:
https://en.cppreference.com/w/cpp/language/constexpr
https://en.cppreference.com/w/cpp/language/if

-end of

--

--

Kerim Fırat

Senior C++,Android Platform(AOSP,AAOS) Developer,Performance Architect,Open Source Contributor | Turkey Java User Group Vice Chairman | Author