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.
to nie jest prośba - to zalecenie. Decyzja należy do kompilatora – chester89