Özyinelemeli bir işlev satır içi olabilir mi?
inline int factorial(int n)
{
if(!n) return 1;
else return n*factorial(n-1);
}
this yukarıdaki kodu "derleme" değilse derleyici tarafından ele doğru. sonsuz yol açacağını buldum okurken
Nasıl bir derleyici satır içi işlevi veya karar mı ?
CEVAP
İlk olarak, bir fonksiyon inline
belirtimi sadece bir ipucu. Derleyici (ve çoğu zaman) tamamen inline
bir niteleyici varlığı ya da yokluğu göz ardı edebilir. O dedi, bir derleyiciolabilirbu kadar özyinelemeli bir işlev satır içi, sonsuz bir döngüye göz önüne sermek. Sadece düzeyi "" işlevini açın. bir sınırlama var
En iyi duruma getirme derleyici bu kodu dönebilir:
inline int factorial(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n * factorial(n - 1);
}
}
int f(int x)
{
return factorial(x);
}
kodu: bu
int factorial(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n * factorial(n - 1);
}
}
int f(int x)
{
if (x <= 1)
{
return 1;
}
else
{
int x2 = x - 1;
if (x2 <= 1)
{
return x * 1;
}
else
{
int x3 = x2 - 1;
if (x3 <= 1)
{
return x * x2 * 1;
}
else
{
return x * x2 * x3 * factorial(x3 - 1);
}
}
}
}
Bu durumda, temelde işlevi 3 kez inlined ettik. Bazı faydalı olabiliryapınbu optimizasyonu gerçekleştirmek. MSVC ayarlamak için bir ayar olması özyinelemeli fonksiyonları üzerinde gerçekleştirilen satır içi uygulaması seviyesi (sanırım 20 kadar) hatırlıyorum.
javascript: anonim işlev özyinelemeli?...
Multi-deyim Tablo Değerli İşlev vs sat...
Neden bir işlev çağrısı daha hızlı ola...
Özyinelemeli bir işlev verim...
Nasıl satırın sonuna ve vuruş sayısı d...