C++'da compile-time (derleme aşamasında) ve link-time (bağlama aşamasında) sabitlik vardır.
const değişkeni, başlatıldıktan sonra değiştirilemeyen bir nesnedir. Ancak const, değerin derleme aşamasında bilineceğini her zaman garanti etmez; bu değer yalnızca çalışma zamanında hesaplanabilir.constexpr ise ifadenin veya işlevin derleme aşamasında zaten hesaplanacağını garanti eder.Örnek:
const int x = time(0); // const, ama DEĞİL constexpr: değer çalışma zamanında hesaplanır constexpr int y = 2 + 2; // constexpr: derleme aşamasında bilinir constexpr int square(int x) { return x * x; } int arr[square(3)]; // dizinin boyutu — derleme zamanı ifadesi
Dizi boyutları veya şablon parametreleri gibi derleyiciye erişebilmesi gereken sabit ifadeler için constexpr kullanın.
constexpr olarak tanımlanan bir işlev, sabit olmayan argümanlarla çağrılabilir mi?
Cevap: Evet! Eğer argümanlar derleme zamanında biliniyorsa, sonuç derleme aşamasında hesaplanır. Eğer argümanlar yalnızca çalışma zamanında biliniyorsa, işlev normal bir işlev olarak hesaplanır.
constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // Çalışma zamanında çağrılır
Hikaye
Modüllerden biri dizinin boyutunu
const intile tanımladı ve bunun derleme zamanı sabiti olduğunu düşündü. Başka bir derleyicide bu hata oluşturdu, çünkü değer çalışma zamanında hesaplandı ve dizinin boyutu standartlara uymadı.
Hikaye
Hash hesaplamalarında derleyici,
constdeğişken kullanıldığı için hesaplamaları optimize edemedi, sonuç: yeni sürümlerde performansın %50'den fazla düşmesi.
Hikaye
Modern standartlara geçişte anahtar kelimeler karıştırıldı ve işlev
constolarak değil,constexprolarak tanımlandı, bu nedenle sonuç compile-time şablon ifadelerinde kullanılamadı. Hızlı bir analiz hata gösterdi, ama gözden geçirme işlemi master'a gitti.