Derleme zamanında C bir dize uzunluğu hesaplama. Bu gerçekten bir constexpr? | Netgez.com
SORU
17 EYLÜL 2014, ÇARŞAMBA


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
17 EYLÜL 2014, ÇARŞAMBA


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:

  1. 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.
  2. Ben constexpr bir anahat yukarıda başlatmak için kullanın.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Ordetta Price

    Ordetta Pric

    12 EYLÃœL 2011
  • RobertDuskin

    RobertDuskin

    12 HAZÄ°RAN 2008
  • theKGB65

    theKGB65

    24 Aralık 2007