Derleme zamanında C bir dize uzunluğu hesaplama. Bu gerçekten bir constexpr?
Bir dize derleme zamanında edebi uzunluğunu hesaplamak için çalışıyorum. Ben bunu yapmak için aşağıdaki kodu kullanıyorum:
#include <cstdio>
int constexpr length(const char* str)
{
return *str ? 1 length(str 1) : 0;
}
int main()
{
printf("%d %d", length("abcd"), length("abcdefgh"));
}
Her şey beklendiği gibi, program 4 ve 8 yazdırır çalışır. Derleme kod çınlama tarafından oluşturulan sonuçları derleme zamanında hesaplanan gösterir:
0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d"
0x100000f65: movl $0x4, %esi
0x100000f6a: movl $0x8, íx
0x100000f6f: xorl êx, êx
0x100000f71: callq 0x100000f7a ; symbol stub for: printf
Sorum ÅŸu: length
fonksiyon değerlendirilecek zaman derleyip standardı tarafından garanti edilir?
Eğer bu derleme zamanı dize hazır hesaplamaları için kapıyı benim için açtı doğruysa... örneğin derleme zamanında karma ve daha birçok hesaplama...
CEVAP
Sabit ifadeleri derleme zaman, biz sadece draft C standard Bölüm 5.19
non-normatif bir teklif değerlendirildi olmasını garanti edilmezSabit ifadeama bu diyor ki:
[...]>[ Not: Sabit ifade sırasında değerlendirilebilir çeviri.—not end ]
constexpr
derleme zamanında değerlendirilir emin olmak için değişken olarak atayabilirsiniz diyor ki Bjarne Stroustrup's C 11 reference Bu bulabilirsinizvurgu benim):
Ayrıca derleme zamanında ifadeleri değerlendirebilmek, edebilmek istiyorumifadeleri derleme zamanında değerlendirilmesi gerekir zaman; değişken tanımı önünde constexpr(ve anlamına gelir) sabit:
Örneğin:
constexpr int len1 = length("abcd") ;
Bjarne Stroustrup isocpp blog entry Bu derleme zamanı değerlendirme temin ederiz ne zaman bir özet verir ve der ki:
[...]Doğru cevap olarak belirtilen bu Ot - standardına göre constexpr bir işlevi olabilir derleyici zamanda değerlendirilecek veya bir olarak kullanılmadığı sürece çalıştırma bu durumda muayene olmanız gerekir sabiti ifadesi, derleme zamanı. Derleme zamanı değerlendirme sağlamak amacıyla, kullanmak zorundayız sabit bir ifade, gerekli olduğu (örneğin, bir dizi bağlı veya dava bir etiket gibi) veya bir constexpr başlatmak için kullanın. Umut ediyorum kendine saygısı olan hiçbir derleyici optimizasyon özlemeyeceği fırsat aslında ne diyor: "constexpr Bir işlevdir eğer tüm değişkenler sabit ise derleme zamanında değerlendirilir ifadeler."
Bu derleme zamanında değerlendirilmesi gerekir, iki durum özetliyor:
- Sabit bir ifade gereklidir, bu ifade
shall be ... converted constant expression
shall be ... constant expression
kullanıldığı taslak standart, bir dizi gibi bir yere bağlı gibi görünüyor-bir bakalım. - Ben
constexpr
bir anahat yukarıda başlatmak için kullanın.
() isset vs strlen() - net dize fast/u...
Java dize gerçekten değişmez mi?...
Bir olmadığından, dize uzunluğu nedir?...
Neden bir Python dizeleri't dize ...
Neden bu dize uzunluÄŸu daha fazla kara...