Powiedzmy, że mam funkcję w moim programie i gdzieś w moim kodzie, funkcja ta jest wywoływana przez wskaźnik funkcji. Co się stanie, jeśli kompilator zainicjuje tę funkcję, lub czy kompilator zda sobie sprawę, że istnieje wskaźnik funkcji przypisany do tej funkcji, a zatem unika go zaznaczania.Co się stanie, jeśli kompilator wstawi funkcję, która jest wywoływana przez wskaźnik funkcji
Odpowiedz
Po pobraniu wskaźnika do funkcji kompilator wygeneruje treść poza linią dla funkcji. Nadal możliwe jest wstawianie funkcji w innych witrynach połączeń.
Należy pamiętać, że funkcja oznaczona inline
musi mieć definicję dostępną we wszystkich JT, które się do niej odnoszą, a definicje te muszą być identyczne. Oznacza to, że możesz całkowicie zainicjować funkcję w niektórych witrynach z telefonami i utrzymywać ją poza linią.
Co się stanie, jeśli definicje nie są identyczne (np. Jakiś kod ifdef'd), a linker otrzyma wiele wersji funkcji? "Inline" jest prawdopodobnie postrzegany przez linker jako słaby symbol, a otrzymujesz pierwszy, który pojawia się? –
@NicholasWilson, który byłby nieprawidłowym programem. –
@NicholasWilson, który byłby naruszeniem zasady jednej definicji, i jest jawnie nazywany jako bez określonego zachowania. –
Cóż, na pewno zadziała. Nie rozumiem, w jaki sposób inline mogłoby temu zapobiec. Masz tylko kod, który wywołuje funkcję bezpośrednio, i może być tam wstawiony, i masz jakiś kod, który wywołuje go za pomocą wskaźnika funkcji, tak jak zwykła funkcja.
Nie ma powodu, dla którego używanie wskaźnika funkcji powinno zapobiegać wstawianiu. Inlining odbywa się indywidualnie dla każdego przypadku i może istnieć równolegle do zwykłej funkcji. Tak więc funkcja może być zaznaczona w jednym miejscu i wywołana w innym.
Kompilator będzie zatem wstawał tam, gdzie może i nadal będzie wywoływał funkcję wywoływaną dla wskaźnika funkcji.
Nie tylko inline kompilator „inne wywołania funkcji”, ale może nawet inline połączenia poprzez wskaźników funkcji, jeśli rozumie wystarczająco dużo o których funkcja jest rzeczywiście używany, coś takiego:
typedef void (*funcptr)();
void somefunc()
{
... do stuff here ...
}
void indirection(funcptr *f)
{
f();
}
void call_with_ptr()
{
funcptr f = somefunc();
for(int i = 0; i < 100; i++)
{
indirection(f);
}
}
Miałem kod podobny do tego, i zwrócił na bok i wywołał somefunc() bezpośrednie połączenie bez użycia wskaźnika funkcji.
Ale oczywiście zakłada to, że kompilator może dowiedzieć się, która funkcja jest wywoływana z kodu - co jest w tym przypadku oczywiste, ale jeśli w grę wchodzą decyzje wykonawcze, może tego nie robić.
- 1. Co się stanie, jeśli dwukrotnie zwolnię funkcję ReleaseMutex()?
- 2. co się stanie, jeśli przekażę strukturę do funkcji vararg?
- 3. Jak uzyskać wartość zwracaną przez funkcję, która jest wywoływana przez NSthread?
- 4. Co stanie się z Braintree.js, jeśli JavaScript jest wyłączony?
- 5. co się stanie, jeśli rzut (wskaźnik do klasy A) na (wskaźnik do jego podklasy B) w C++
- 6. Co się stanie, jeśli zapomnę zamknąć zestaw?
- 7. Co się stanie, jeśli konstruktor zgłasza wyjątek?
- 8. Co się stanie, jeśli zaimplementuję klasę w pliku nagłówkowym?
- 9. Jak zadeklarować funkcję, która zwraca wskaźnik do funkcji, która zwraca wskaźnik funkcji bez użycia typedef w C?
- 10. Co się stanie, jeśli użyję "rzutu"; bez wyjątku do rzutu?
- 11. Co się stanie, jeśli spróbujesz przekierować przed przesłaniem formularza?
- 12. Co się stanie, jeśli funkcje rekursywne będą wstawiane jako wbudowane?
- 13. Co się stanie, jeśli lambda zostanie przeniesiona/zniszczona podczas działania?
- 14. Co się stanie, jeśli zmieni się obiekt __hash__?
- 15. Co się stanie, jeśli konstruktor shared_ptr zakończy się niepowodzeniem?
- 16. Co się stanie, jeśli program sterownika się zawiesi?
- 17. Co się stanie, jeśli niepoprawny adres zostanie uprzednio pobrany?
- 18. C: Wskaźnik do funkcji
- 19. Co się stanie, jeśli zadzwonię wait na zmienną warunku powiadomienia
- 20. Co się stanie, jeśli certyfikat dystrybucji systemu iOS wygasł?
- 21. Co się stanie, jeśli wywołasz funkcję Java z wielu wątków z C z JNI?
- 22. Co stanie się, jeśli więcej niż jeden pthread używa tej samej funkcji?
- 23. Co się stanie, jeśli wywołam funkcję elementu obiektu z innego wątku?
- 24. iOS5 Storyboard UIViewController, która metoda init jest wywoływana przez storyboard?
- 25. Co to jest wskaźnik funkcji wewnątrz struktury w c?
- 26. W języku JavaScript, co się stanie, jeśli "usuniesz" właściwość, która nie istnieje?
- 27. Co jest #zdefiniowane, jeśli kompilator jest zgodny z Cpp0x?
- 28. Co się stanie, jeśli wywołam Dispose() przed użyciem zakończenia instrukcji?
- 29. Co się stanie, jeśli nie użyjesz "tego" w klasie?
- 30. Co się stanie, jeśli obiekt zmieni rozmiar własnego kontenera?
Zobacz Herb Sutter's [Inline Redux] (http://www.drdobbs.com/inline-redux/184403879). –