2009-08-13 19 views
6

Funkcje wbudowane są po prostu żądaniem kompilatorów, które wstawiają cały obiekt funkcji inline w każdym miejscu kodu, w którym ta funkcja jest używana.Funkcja wbudowana (kiedy wstawić)?

Ale w jaki sposób kompilator decyduje, czy należy go wstawić, czy nie? Który algorytm/mechanizm używa do decydowania?

Dzięki,

Naveen

+1

to nie jest prośba - to zalecenie. Decyzja należy do kompilatora – chester89

Odpowiedz

4

Niektóre wspólne aspekty:

  • opcja kompilatora (debug buduje zazwyczaj nie inline, a większość kompilatory mają możliwości, aby zastąpić inline deklaracja, aby spróbować wstawić wszystkie lub żadna)
  • odpowiednia konwencja wywoływania (np. funkcje varargs zwykle nie są inkrementowane)
  • nadaje się do wstawiania: zależy od wielkości funkcji, częstotliwości wywołania funkcji, zysków przez inlining, i zestaw optymalizacji (szybkość i rozmiar kodu). Często małe funkcje mają największe korzyści, ale ogromny funkcja może być inlined jeśli to się nazywa po prostu raz
  • głębokości wezwanie inline i rekursji ustawień

The 3rd jest chyba sedno pytania, ale to jest naprawdę "heurystyka specyficzna dla kompilatora" - należy sprawdzić dokumentację kompilatora, ale zazwyczaj nie dają one wielu gwarancji. MSDN ma pewne (ograniczone) informacje dla MSVC.

Poza trywialnościami (np. Proste moduły pobierające i bardzo prymitywne funkcje), podtytułowanie jako takie nie jest już zbyt pomocne. Koszt instrukcji wezwania spadł, a prognozy rozgałęzień znacznie się poprawiły.

Wielką szansą dla inline jest usuwanie ścieżki kodu kompilator wie, że nie zostaną podjęte - jako skrajny przykład:

inline int Foo(bool refresh = false) 
{ 
    if (refresh) 
    { 
     // ...extensive code to update m_foo 
    } 
    return m_foo; 
} 

Dobry kompilator inline Foo(false), ale nie Foo(true).

z linkiem Czas generowania kodu, Foo mógł przebywać w .cpp (bez inline declararion) i Foo(false) nadal będzie inlined, więc znowu inline ma wpływ jedynie marginalne tutaj.


Podsumowując: Istnieje kilka sytuacji, w których należy próbować wziąć ręcznego sterowania poprzez umieszczenie inline (lub pominięcie) oświadczenia inline.

-2

wstawia jeśli piszesz "inline" do początku funkcji?

+2

Nie musi być. To tylko prośba. – Naveen

+0

W języku C++ oznacza to jedynie, że nie powoduje błędów łącznika, jeśli różne pliki obiektów zawierają tę samą definicję. Jest to wymagane przez standard.Używanie 'inline' lub nie jest zwykle w żaden sposób skorelowane, czy funkcja naprawdę zostanie zainicjowana. – gimpf

+0

przynajmniej komentarze informują ludzi :) – ufukgun

2

Wszystko, co wiem o funkcjach wbudowanych (i wielu innych rzeczach w języku C++) to here.

Ponadto, jeśli koncentrujesz się na heurystyce każdego kompilatora, aby zdecydować, czy funkcja jest włączona, czy nie, zależy to od implementacji i powinieneś przejrzeć dokumentację każdego kompilatora. Należy pamiętać, że heurystyka może również ulec zmianie w zależności od poziomu optymalizacji.

1

Jestem prawie pewna, że ​​większość kompilatorów decyduje o długości funkcji (gdy jest skompilowana) w bajtach i jak często jest używana w stosunku do typu optymalizacji (szybkość vs rozmiar).

1

Znam tylko kilka kryteriów:

  • Jeśli inline spełnia rekurencję - inline będą ignorowane.
  • przełącznik/podczas/w większości przypadków powoduje kompilator zignorować inline
1

To zależy od kompilatora. Oto (pierwsza część), co instrukcja GCC mówi:

 
    -finline-limit=n 
      By default, GCC limits the size of functions that can be inlined. 
      This flag allows the control of this limit for functions that are 
      explicitly marked as inline (i.e., marked with the inline keyword 
      or defined within the class definition in c++). n is the size of 
      functions that can be inlined in number of pseudo instructions (not 
      counting parameter handling). The default value of n is 600. 
      Increasing this value can result in more inlined code at the cost 
      of compilation time and memory consumption. Decreasing usually 
      makes the compilation faster and less code will be inlined (which 
      presumably means slower programs). This option is particularly 
      useful for programs that use inlining heavily such as those based 
      on recursive templates with C++. 

      Inlining is actually controlled by a number of parameters, which 
      may be specified individually by using --param name=value. The 
      -finline-limit=n option sets some of these parameters as follows: 

      @item max-inline-insns-single 
      is set to I/2. 
      @item max-inline-insns-auto 
      is set to I/2. 
      @item min-inline-insns 
      is set to 130 or I/4, whichever is smaller. 
      @item max-inline-insns-rtl 
      is set to I. 

      See below for a documentation of the individual parameters 
      controlling inlining. 

      Note: pseudo instruction represents, in this particular context, an 
      abstract measurement of function's size. In no way, it represents 
      a count of assembly instructions and as such its exact meaning 
      might change from one release to an another. 
2

Poniżej w FAQ do Sun Studio 11 kompilatora:

kompilator generuje funkcję inline jako zwykłej funkcji na żądanie (z linii), gdy którykolwiek z następujących warunków:

  • Kompilujesz z + d.
  • Kompilujesz z -g.
  • Adres funkcji jest potrzebny (tak jak w przypadku funkcji wirtualnej).
  • Funkcja zawiera struktury kontrolne, których kompilator nie może wygenerować w linii.
  • Funkcja jest zbyt skomplikowana.

Według odpowiedzi na post przydatności clamage45 ' „struktur sterowania że kompilator nie generują inline” są:

  • funkcja zawiera konstrukty zabronione, jak pętla , przełącznik lub goto

Kolejną listę można znaleźć here. Jak większość innych odpowiedzi podano heurystyki będą 100% kompilator specyficzne, z tego co czytałem Myślę, że w celu zapewnienia, że ​​funkcja jest faktycznie inlined trzeba unikać:

  • lokalne zmienne statyczne
  • pętla konstruuje
  • oświadczenia przełącznika
  • try/catch
  • goto
  • rekurencji
  • i oczywiście zbyt skomplikowane (cokolwiek to m eans)
Powiązane problemy