wywołania
Serwis znalezionych hasełOdnośniki
- Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
- Co robić? – zastanawiała się, kompletnie rozstrojona...
- nienawiść i zawziętość należy wykorzenić przez szczere przebaczenie...
- - Niech żrą gips i srają ikrą łososia!!! ***Roman, siedząc na ruinach wieży poniemieckiego stanowiska dowodzenia, próbował rozkoszować...
- Mimo to w żyłach elfa płynęła adrenalina wywołana łowami – górskim szlakiem poniżej uciekał tuzin orków – a jeszcze bardziej...
- Kiedy Canan przejął zarządzanie codziennymi operacjami magazynu, Lovejoy jeszcze bardziej skupił swą uwagą na rekrutacji, sprowadzając ostatecznie jeszcze...
- - Nie będzie ci już dłużej potrzebna - oznajmiła...
- Wcale nie zasypiam tak często, choć może niełatwo wam w to uwierzyć — dodał z uśmiechem...
- Chrystusa i Samarytankę - naturalnie przy studni - Malczewski malował trzykrotnie, ale żadne z tych ujęć nie odpowiada, jak podkreśla Kazimierz Wyka, przekazowi...
- Dwaj Ulgosi czekali na nich przy wejściu do jednego z tuneli...
- Kiedy Stâven zobaczył, że Fâlessanowi drżą ręce, sam pozapinał mu kurtkę na guziki, znalazł jego hełm i założył mu na głowę...
Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
Może się to zdarzyć w następujących przypadkach:
funkcje rekurencyjne,
funkcje, do których odwołujemy się za pośrednictwem wskaźnika z innego
miejsca w danej jednostce translacji.
Te i inne przypadki (w zależności od uznania kompilatora) mogą kolidować z rozwinięciem w miejscu wywołania. Nie należy zatem polegać na specyfikatorze inline, jeśli dana funkcja ma być rozwinięta w miejscu wywołania.
36
Rozdział 2. Słowa kluczowe, modyfikatory oraz instrukcje
Należy zauważyć, że aby funkcja mogła kandydować do rozwinięcia w miejscu wywo-
łania, musi być zdefiniowana w nowej formie. Funkcje, które są zadeklarowane jako inline, a które nie są funkcjami składowymi klasy, posiadają łączność wewnętrzną (ang. internal linkage), chyba że określono inaczej.
Tak jak w przypadku zwykłych funkcji, nie istnieje zdefiniowany porządek wyliczania argumentów do funkcji typu inline. W rzeczywistości, może się on różnić do kolejności, w jakiej argumenty są wyliczane w przypadku przekazywania z wykorzystaniem protokołu wywoływania zwykłych funkcji.
Opcja optymalizacji kompilatora /Ob pomaga ustalić, czy faktycznie nastąpiło rozwinięcie funkcji w miejscu wywołania.
Przykład 1.
; 8
$( &
J
' $
Funkcje składowe klasy mogą zostać zadeklarowane jako inline albo przez zastosowanie słowa kluczowego inline, albo przez umieszczenie definicji funkcji wewnątrz definicji klasy.
Przykład 2.
;
$ 9:,H
+ I $J
$
QP
:
' II IIEE = = ;= =;> >
':
' $
Słowo kluczowe __inline jest równoznaczne słowu kluczowemu inline.
Nawet po zastosowaniu specyfikatora __forceinline, w pewnych okolicznościach kom-
pilator może nie wykonać rozwinięcia funkcji w miejscu wywołania. Kompilator nie może rozwinąć funkcji w miejscu wywołania, jeżeli:
Funkcja oraz kod, który ją wywołuje, zostały skompilowane z wykorzystaniem
opcji /Ob0 (opcja domyślna w przypadku kompilacji w trybie testowania).
Słowa kluczowe od A do Z
37
Funkcja oraz kod, który ją wywołuje, wykorzystują różne typy mechanizmów
obsługi wyjątków (funkcja — mechanizm obsługi wyjątków C++,
kod — mechanizm strukturalnej obsługi wyjątków).
Funkcja posiada zmienną listę argumentów.
Funkcja korzysta z instrukcji wbudowanego asemblera, chyba że została
skompilowana z wykorzystaniem opcji /Og, /Ox, /O1 lub /O2.
Funkcja zwraca „nieodwijalny” (ang. unwindable) obiekt przez wartość
w przypadku kompilacji z wykorzystaniem opcji /GX, /EHs lub /EHa.
Funkcja otrzymuje „nieodwijalny” (ang. unwindable) obiekt utworzony w wyniku
kopiowania, przekazany przez wartość w przypadku kompilacji z wykorzystaniem
opcji /GX, /EHs lub /EHa.
Funkcja jest rekurencyjna i nie towarzyszy jej dyrektywa #pragma
inline_recursion(on). W przypadku użycia tej dyrektywy, funkcje mogą być
rozwinięte w miejscu wywołania do domyślnej głębokości ośmiu wywołań.
W celu zmiany tej głębokości należy użyć dyrektywy #pragma inline_depth.
Funkcja jest wirtualna i jest wirtualnie wywoływana. Wywołania bezpośrednie
funkcji wirtualnych mogą zostać rozwinięte.
Program pobiera adres funkcji i wywołanie wykonywane jest za pośrednictwem
wskaźnika do tej funkcji. Bezpośrednie wywołania takich funkcji mogą zostać
rozwinięte.
Funkcja została również oznaczona modyfikatorem __declspec(naked).
W przypadku, gdy kompilator nie może rozwinąć w miejscu wywołania funkcji zade-klarowanej ze specyfikatorem __forceinline, generowane jest ostrzeżenie poziomu 1
(o kodzie 4717).
Wywołania funkcji rekurencyjnych mogą być zastąpione ich treścią do głębokości okre-
ślonej przez dyrektywę #pragma inline_depth. Po przekroczeniu tej głębokości, wywo-
łania funkcji rekurencyjnej traktowane są jak wywołania kopii danej funkcji. Dyrektywa
#pragma inline_recursion steruje rozwinięciem w miejscu wywołania funkcji, która
w danej chwili poddawana jest rozwinięciu.
__hook
Kojarzy metodę obsługi ze zdarzeniem.
! !"
, -.
38
Rozdział 2. Słowa kluczowe, modyfikatory oraz instrukcje
Parametry
&KlasaŹródła::MetodaZdarzenia
Wskaźnik do metody zdarzenia, do której „przyczepiamy” (ang. hook) metodę
obsługi zdarzenia:
Zdarzenia rodzime C++: KlasaŹródła to klasa źródła zdarzenia,
a MetodaZdarzenia to samo zdarzenie.
Zdarzenia COM: KlasaŹródła to interfejs źródła zdarzenia,
a MetodaZdarzenia to jedna z jego metod.
Zdarzenia zarządzane: KlasaŹródła to klasa źródła zdarzenia,
a MetodaZdarzenia to samo zdarzenie.
interfejs
Nazwa interfejsu, który jest „przyczepiany” do odbiorcy — wyłącznie
w przypadku odbiorców zdarzeń COM, w których parametr zależny_od_układu
atrybutu event_receiver ma wartość true.
źródło
Wskaźnik do egzemplarza źródła zdarzenia. W zależności od typu kodu
(parametr typ) określonego w atrybucie event_receiver, źródło może być:
wskaźnikiem do obiektu źródła zdarzenia rodzimego,
wskaźnikiem opartym na interfejsie IUnknown (źródło COM),
wskaźnikiem do obiektu zarządzanego (w przypadku zdarzeń zarządzanych).
&KlasaOdbiorcy::MetodaObsługi
Wskaźnik do metody obsługi zdarzenia, która ma być „przyczepiona” do zdarzenia.
Procedura obsługi jest zdefiniowana jako metoda klasy lub referencja do metody.
Jeśli nazwa klasy nie zostanie określona, instrukcja __hook przyjmie, że jest nią
nazwa klasy, w której instrukcja ta jest wywoływana.
Zdarzenia rodzime C++: KlasaOdbiorcy to klasa odbiorcy zdarzenia,
a MetodaObsługi to procedura obsługi.
Zdarzenia COM: KlasaOdbiorcy to interfejs odbiorcy zdarzenia,