c++ constexpr. const ifadesi değil!

Umarım yararlı bir okuma olur.
c++ 11 ile gelen bir diğer ifade constexpr ifadesidir. Biraz kafa karıştırıyor const ile constexpr arasındaki fark nedir diye.
constexpr ifadesi derleme sırasında hesaplana, işlenen ifadelerdir. Derleme aşamasında işlemi bitirdiğinden çalışma zamanında çok iyi bir performans kazancı verecektir. c++ optimizasyonunun doruk noktası olarak görüyorum.
Eğer constexpr olmayan bir ifadeyle kullanılırsa derleyici sürekli hata verir. Genelde kısa fonksiyonlar yazmak için kullanılır. Makro fonksiyonlarının(hiç tavsiye etmem) çok daha gelişmiş hali olarak düşünebilirsiniz.
Maalesef bu ifadeyi tüm derleyiciler tam anlamıyla desteklemiyor. gcc ve visual studio son versiyonlarını kullanmanızı tavsiye ederim. kullanırken ayarlarda son c++ versiyonu kullanacağınızı belirterek derleyin.

Constexpr kullanırken birkaç kurala dikkat etmemiz şarttır. Genel olarak çalışma zamanında gerçekleşen hiçbir şey kullanılamaz.
1) Literal tipleri kullanmak gerekir.
2) virtual kelimesi kullanılamaz.
3) try-catch yani hata yakalama kullanılamaz.
4) assembly kodu eklemek için asm kelimesi kullanılamaz.
5) goto kullanılamaz.
6) static yada thread gibi kavramlar kullanılamaz.
7) switch,case,default kullanılamaz. (c++14 ile if-else geldiğine göre belki ileride kullanılabilir.)

c++14 ve c++17 versiyonlarıyla bu ifade gerçekten kullanışlı hale geldi. öyleki referans,if ifadesini ve yinelemeli çağrıları kullanabiliyoruz.

Örnekler;
//sabit sayı döndürülebilir.
constexpr int GetNumber() {
return 42;
}

// iki sabit sayı yazılabilir.
constexpr int Add(int x, int y) {
return x + y;
}

// basit bir karar ifadesi
constexpr int Max(int x, int y) {
//C++14 compiler gerekli
//if (x > y)
// return x;
//return y;
return x > y ? x : y;
}
//faktöryel böyle hesaplanır :)
constexpr int fac(int n) {
 return n == 1 ? 1 : n*fac(n - 1);
}


// değer ile kullanımı
constexpr float exp(float x, int n){
    return n == 0 ? 1 :
    n % 2 == 0 ? exp(x * x, n / 2) :
    exp(x * x, (n - 1) / 2) * x;
 }
 // referans ile kullanımı
constexpr float exp2(const float& x, const int& n){
    return n == 0 ? 1 :
    n % 2 == 0 ? exp2(x * x, n / 2) :
    exp2(x * x, (n - 1) / 2) * x;
 }

//fonksiyon içinde kullanımı
constexpr Foo foo(5); //tamam
Foo foo(5); //HATA!!!

Yorumlar

Popüler Yayınlar