Czy LLVM automatycznie konwertuje metody Objective-C na funkcje śródliniowe, jeśli jest to możliwe?Czy LLVM konwertuje metody Objective-C na funkcje wbudowane?
(czyli jest to tak samo wydajnych stworzyć metodę Objective-C dla bloku kodu, który można wkleić inline inaczej?)
Jeśli LLVM nie wykonuje tej optymalizacji, to dlaczego nie? Jeśli tak, (a) czy są jakieś ustawienia kompilacji, które muszę ustawić, aby tak się stało? (b) Jak mogę stwierdzić, czy metoda Objective-C będzie inline?
Odpowiedz
Nie, ponieważ nie można go poznać w kontekście środowiska uruchomieniowego Obj-C, jeśli można przeprowadzić takie optymalizacje. Należy pamiętać, że metody Obj-C są wywoływane przez wysyłanie wiadomości, wiadomości te mogą pochodzić z więcej niż tylko składni [myObject doSomething]
.
Rozważ [obj performSelector:NSSelectorFromString(@"hello")]
fakt, że może się tak zdarzyć, oznacza, że niemożliwe byłoby kiedykolwiek wstawienie jakiejkolwiek metody.
Istnieje również łańcuch zdarzeń, który występuje, gdy wiadomość zostanie odebrana przez klasę, zdarzenia te mogą przekierować, a nawet zmienić wysyłaną wiadomość. Dzieje się to w sposób przejrzysty pod przesłaniem wiadomości.
nr Istotną cechą Objective-C, która wiadomość wysyłka (należy pamiętać, że w Obj-C wysłać wiadomość, nie wywołać metodę) dzieje się dynamicznie w czasie wykonywania, a nie w czasie kompilacji czas.
Z tego powodu wysyłanie komunikatów w Obj-C zawsze będzie trwać nieco wolniej niż zwykłe wywołanie funkcji (nawet jeśli funkcja nie jest wstawiona).
Załóżmy na chwilę, że kompilator inlines metodę:
@implementation AwesomeClass
- (void)doFoo OBJC_INLINE { // or some way to indicate "this is an inline method"
NSLog(@"doing foo!");
}
- (void)doBar {
[self doAwesomeStuff];
[self doFoo];
}
@end
tak że -doBar
zasadniczo postać:
- (void)doBar {
[self doAwesomeStuff];
{
NSLog(@"doing foo!");
}
}
niesamowite, że wydaje się, że byłoby szybciej, prawda? Zapisujemy sobie całe tuziny instrukcji, nie wywołując objc_msgSend
. Więc spakuj to i opublikuj jako plik .a.
NSCleverCoder przychodzi i mówi „ale chcę doFoo
zrobić trochę więcej”, tak robi:
@interface SuperAwesomeClass : AwesomeClass @end
@implementation SuperAwesomeClass
- (void)doFoo {
NSLog(@"doing more foo!");
[super doFoo];
}
@end
Kiedy próbuje uruchomić to, nigdy nie jest wywoływana, ponieważ AwesomeClass
nigdy faktycznie wywołuje metodę -doFoo
.
"Ale", mówisz, "to jest wymyślny przykład!"
Nie, nie jest. W Objective-C jest to całkowicie legalne w dowolnym momencie tworzenia lub wykonywania aplikacji. Mogę to zrobić, pisząc kod. Heck, mogę nawet zrobić to w czasie wykonywania, używając objc_allocateClassPair
i class_addMethod
, aby dynamicznie utworzyć podklasę i dodać nadpisanie metody.
Potrafię również implementować metody metody swizzle.Nie podoba ci się istniejąca implementacja -doFoo
? To super; Zamień go na swój własny. Zaczekaj; jeśli metoda została wstawiona, twoja nowa implementacja nigdy nie zostanie wywołana, ponieważ -doBar
nigdy nie wywołuje metody -doFoo
.
Mogłem zobaczyć, że jest to możliwe, jeśli istnieje jakiś sposób opisania metody jako nieprzykrywalnej. But there's no way to do that, więc problem jest dyskusyjny. I nawet wtedy, nadal byłby to zły pomysł; tylko dlatego, że kompilator nie pozwala ci to zrobić, nie oznacza, że nie możesz wciąż pracować nad nim w czasie wykonywania. Znowu natkniesz się na problemy.
Sądzę, że po prostu myślałem, że kompilator może wykryć takie przypadki, w których metoda jest wywoływana w ramach przesłoniętej metody, a także wstawić ją do nadrzędnej metody ... Ale widzę, jak kompilator musiałby być bardzo cienki i inteligentny Zrób to. Nadal ... ARC jest całkiem niesamowite ... Może mogliby dodać kolejną fajną funkcję do LLVM, która wie, jak wbudować metody. – ma11hew28
- 1. Funkcje wbudowane
- 2. Funkcje wbudowane w C++
- 3. Czy funkcje asynchroniczne mogą być wbudowane?
- 4. Haskell LLVM - Powielone funkcje utworzone
- 5. Czy czas wywołania metody super klasy jest ważny w ObjectiveC?
- 6. Czy lambdas jest wbudowane jak funkcje w C++?
- 7. Czy wbudowane funkcje wirtualne są naprawdę pozbawione sensu?
- 8. Konwertuje scss na css
- 9. Czy wbudowane metody Pythona są dostępne w alternatywnej przestrzeni nazw?
- 10. Metody Java vs. funkcje
- 11. Funkcje a metody statyczne
- 12. Czy istnieje sposób na zawinięcie bloku ObjectiveC do wskaźnika funkcji?
- 13. Co właściwie robi ustawienie wbudowane Xcode 5 "Nieużywane funkcje"?
- 14. Dlaczego niektóre "funkcje" wbudowane w python faktycznie są typami?
- 15. Funkcje wbudowane w kompilację debugowania (Visual C++ 2008)
- 16. Nieudokumentowane wbudowane funkcje renderowania plików PDF w systemie Windows?
- 17. Tablica PHP kopiuje określone klucze, wbudowane funkcje? Zagnieżdżona wydajność pętli?
- 18. Funkcje wbudowane Pythona nie są tak naprawdę funkcjami, prawda?
- 19. programowo konwertuje kml na obraz
- 20. Czy funkcje alertów i potwierdzeń są wbudowane w JavaScript, czy też są częścią DOM?
- 21. llvm na xb barebone?
- 22. Co się stanie, jeśli funkcje rekursywne będą wstawiane jako wbudowane?
- 23. Double nie konwertuje na int
- 24. Czy istnieje autorytatywne odniesienie do wyjątków, które mogą być wrzucane przez wbudowane funkcje Matlab?
- 25. Dziedziczenie i wbudowane?
- 26. ObjectiveC Parse Integer from String
- 27. Wdrożenie ObjectiveC protokół w szybkim
- 28. Języki funkcjonalne ukierunkowane na LLVM
- 29. TimeZoneInfo.ConvertTime nie konwertuje coś
- 30. Wbudowane w Clang nie tak wbudowane?
Dlaczego LLVM nie może zastąpić zwykłych połączeń, np. '[Obj x]; Wywołania obj.x' i 'performSelector', np.' [obj performSelector: x_sel] ', itp., z treścią metody' x'? I dlaczego nie może sprawdzić implementacji metod takich jak 'forwardInvocation:', aby określić, czy powinien on wstawiać? C'mon LLVM, bądź sprytniejszy! :) – ma11hew28
Ponieważ mogą być wymieniane w czasie wykonywania trywialnie. Mogę zmienić impendę dowolnej metody w 3 lub 4 liniach kodu środowiska wykonawczego. –