SORU
10 EKİM 2008, Cuma


Ö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
10 EKİM 2008, Cuma


İ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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hidetake takayama

    hidetake tak

    3 Mart 2009
  • Joshua Kywn

    Joshua Kywn

    17 Mayıs 2010
  • The Dubstep FX

    The Dubstep

    5 Mart 2011