Istnieją dwa nieco odrębne decyzje dotyczące kompilator robi funkcja inline:
- , czy dana funkcja jest wywołanie inlined;
- , czy istnieje nielinearna wersja funkcji.
Pierwsza jest określana przez kompilator osobno dla każdego przypadku, jeśli w tym momencie możliwe jest wstawianie. Nie będzie to możliwe, jeśli funkcja jest wirtualna lub wywołana przez wskaźnik funkcji i nie może ustalić w czasie kompilacji, która funkcja ma zostać wywołana. Nie będzie możliwe, jeśli definicja nie będzie dostępna dla kompilatora, być może dlatego, że jest zdefiniowana w innej jednostce tłumaczeniowej, a kompilator nie wykonuje "pełnej optymalizacji programu". Decyzja może, ale nie musi, być zależna od tego, czy funkcja jest zadeklarowana jako inline
, i innych czynników, takich jak jej rozmiar i jak często jest wywoływana.
Druga zależy od tego, czy wymagana jest wersja nielinearna. Będzie to wymagane, jeśli żadne połączenie z nim nie zostanie zainicjowane. Będzie również (jak na swoją ofertę) wymagane, jeśli cokolwiek potrzebuje adresu funkcji, ponieważ wtedy musi mieć adres. Może się to zdarzyć bezpośrednio (na przykład poprzez przypisanie adresu do wskaźnika funkcji) lub pośrednio (na przykład funkcje wirtualne będą potrzebowały przechowywania ich gdzieś w celu sprawdzenia w środowisku wykonawczym zgodnie z typem dynamicznym obiektu).
Istnienie nieliniowej wersji nie uniemożliwi zainicjowania żadnego konkretnego wywołania tej funkcji, chociaż możliwe, że wpłynie ona na decyzję kompilatora, szczególnie jeśli jest skonfigurowany do optymalizacji pod kątem rozmiaru kodu.
Podsumowując, Twoja oferta jest uproszczona i nie do końca dokładna; kompilator może nadal "wykonywać inlining", jeśli adres jest zajęty, po prostu nie można pominąć wersji nielinearnej.
Och, nienawidzę tego nowego bezpłatnego systemu dociekań. Co do diabła było nie tak z tym pytaniem, ludzie? –
Z ciekawości, jaką książkę zawiera to stwierdzenie? –
+1 do walki z anonimowym drive-by downvoter –