Ö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.
Nasıl satırın sonuna ve vuruş sayısı d...
Bir yıkıcı özyinelemeli olabilir?...
komutu ls: nasıl tam yol özyinelemeli ...
javascript: anonim işlev özyinelemeli?...
Multi-deyim Tablo Değerli İşlev vs sat...