Giriş
constexpr
uygulamaya bir şeyin sürekli ifade gerektiren bir bağlamda değerlendirilebileceğini söylemenin bir yolu olarak sunulmamıştır ; uygun uygulamalar C ++ 11'den önce bunu kanıtlayabilmiştir.
Bir uygulama ispat edemez şey değildir niyet kod belli parçasının:
- Geliştiricinin bu varlıkla ifade etmek istediği şey nedir?
- Kodun , işe yaradığı için sabit ifadede körü körüne kullanılmasına izin vermeli miyiz ?
Dünya onsuz ne olurdu constexpr
?
Diyelim ki bir kütüphane geliştiriyorsunuz ve aralıktaki her tamsayı toplamını hesaplayabileceğinizi fark edelim (0,N]
.
int f (int n) {
return n > 0 ? n + f (n-1) : n;
}
Niyet eksikliği
Bir derleyici, çeviri sırasında geçen argüman biliniyorsa yukarıdaki fonksiyonun sabit ifadede çağrılabilir olduğunu kolayca kanıtlayabilir ; ancak bunu bir niyet olarak ilan etmediniz - durum böyle oldu.
Şimdi başka biri gelir, fonksiyonunuzu okur, derleyici ile aynı analizi yapar; " Ah, bu işlev sabit bir ifadede kullanılabilir!" ve aşağıdaki kod parçasını yazar.
T arr[f(10)]; // freakin' magic
Optimizasyon
"Harika" bir kitaplık geliştiricisi olarak, f
çağrıldığında sonucu önbelleğe almanız gerektiğine siz karar verirsiniz ; kim aynı değerleri tekrar tekrar hesaplamak ister ki?
int func (int n) {
static std::map<int, int> _cached;
if (_cached.find (n) == _cached.end ())
_cached[n] = n > 0 ? n + func (n-1) : n;
return _cached[n];
}
Sonuç
Aptalca optimizasyonunuzu tanıtarak, sabit ifadenin gerekli olduğu bir bağlamda gerçekleşen işlevinizin her kullanımını kırdınız.
Fonksiyonun sabit bir ifadede kullanılabileceğine asla söz vermediniz ve constexpr
böyle bir vaat vermenin hiçbir yolu olmazdı.
Peki, neden ihtiyacımız var constexpr
?
Constexpr'in birincil kullanımı niyet beyan etmektir .
Bir varlık olarak işaretlenmezse constexpr
- asla sabit ifadede kullanılması amaçlanmamıştır ; ve öyle olsa bile, bu bağlamı teşhis etmek için derleyiciye güveniriz (çünkü niyetimizi göz ardı eder).
constexpr
? Eğer öyleyse, bir kullanım görebiliyorum.